2011-07-14 1 views
1

Devel :: REPLセッションです(私のPerlバージョンはv5.10.1です)。結果を説明してください。括弧はPerl 5でどのように機能しますか?

0:main$ my $x = 1,2,4 
[ 
    1, 
    2, 
    4 
] 

0:main$ my $y = (1,2,4) 
Useless use of a constant in void context at (eval 296) line 8. 
4 

私はちょうどPerlを学び始めていますが、まだ文脈を突き詰めています。とにかく、私は2番目の割り当てがなぜそれをするのか理解していると思います。これは、スカラーコンテキストを持っているからです。そのため、リストが構築されず、コンマ演算子が繰り返し実行されてしまいます。その間、演算子は単にその右のオペランドを返します。右?

ただし、最初の割り当てで何が問題になっていますか?それは第2のものと同等ではないでしょうか?ある時点では、括弧はリストを構築するための魔法のセマンティクスを提供していないと考えました。要素をグループ化するだけで、要素がリストのコンテキストで使用されると、リストに変換されます。どうやら、それは当てはまりません。

括弧の特別な役割は何ですか?

答えて

6

Devel::REPLに等しくなる私はあなたがDevel::REPLscalar(my $x = 1,2,4)を実行した場合、結果は4と$xだろう賭けるだろうリストコンテキスト内の各入力行を評価して、結果のリストを印刷しています。解析され

say join ', ' => do {my $x = 1, 2, 4} 

say join ', ' => do {(my $x = 1), (2), (4)} 

そしてそれはdoブロックからの3つの値を受信して​​からREPLプリント "1、2、4" SO効果的に最初の行のようなものです。

二行目は、次のとおりとして解析さ

say join ', ' => do {my $x = (1, 2, 4)} 

say join ', ' => do {(my $x = scalar(1, 2, 4))} 
スカラーコンテキストでリスト doブロックによって $xに割り当て、その後戻され、その最後の要素を返し

続いて「4」を印刷する。

+0

私は今それを得ると思います。 – mob

+0

ありがとうございました!続いて '$ x'を言うと実際に' 1'が出力されます。 –

5

最初のステートメントの動作はDevel::REPLの結果だと思いますが、私はその仮定をテストするために現時点で私には利用できません。

Perlのかっこは、主に優先度を調整します。パーサがいくつかの文をどのように見ているかを調整することもできますが、ここではそうではありません。 =,よりも高い優先順位を持ちます。したがって、最初のステートメントでは、Devel::REPLがリストコンテキストでステートメントを評価する場合、最初の要素が1から$xへの割り当ての結果で、2番目と3番目の値が2 2番目の優先順位が変更され、結果としてコンテキストが変更されて,がスカラーコンテキストになり、4が$xに割り当てられます。

$ perl -MO=Deparse,-p -e 'my $x = 1,2,4' 
((my $x = 1), '???', '???'); 
-e syntax OK 

$ perl -MO=Deparse,-p -e 'my $x = (1,2,4)' 
(my $x = ('???', '???', 4)); 
-e syntax OK 

1.

+0

ありがとう!私はエリックとあなたの両方の返事を記入することができればいいと思っています。 Deparseのための余分なありがとう! –

関連する問題