2

Learning Perl、第6版から知っています。(ISBN: 978-1-449-30358-7) p.58($x, $y) = "something", "new";リストコンテキストです。では、なぜ次のコードは "bee" を出力するのでしょうか? コードがどのように解析されるかを説明してください。

$dina = bobba;
$ba = bee;
print " " . ($dina, $ba)."\n";
4

3 に答える 3

4

最も関連性の高いドキュメントの引用は、perlop(1) からの次の段落です。

Comma Operator
    Binary "," is the comma operator.  In scalar context it evaluates its
    left argument, throws that value away, then evaluates its right
    argument and returns that value.  This is just like C's comma operator.
于 2012-08-23T09:10:18.367 に答える
4

連結演算子.は、コンマ演算子によって作成されたリストにスカラー コンテキストを課すため、最後のメンバーを返します。

于 2012-08-23T08:38:06.087 に答える
2

"($x, $y) = ("something", "new");はリスト コンテキストです。" 意味がありません。(トピックから外れないように、欠けていた括弧を追加しました。)

まず、何かがリスト コンテキストで評価されます。

第二に、投稿したものからその式がどのコンテキストで評価されるかを知る方法はありませんが、無効なコンテキストで評価される可能性があります。

サブ式($x, $y)andを参照している可能性があり("something", "new")ます。それらは実際にリストコンテキストで評価されます。これは、リスト代入演算子がそのオペランドをリストコンテキストで評価するためです。

コードで($x, $y)は、連結演算子 ( .) のオペランドです。連結演算子は 2 つの文字列を結合するため、文字列をオペランドとして想定します。文字列はスカラーであるため、連結演算子はそのオペランドをスカラー コンテキストで評価します。


スカラーコンテキストでは、

$x, $y

とほぼ同じです

do { $x; $y }

(追加のスコープなし)。リストの各項目は void またはスカラー コンテキストで順番に評価され、全体はリストの最後の項目が返したものに評価されます。

>perl -E"sub f { say 'f'; 3 } sub g { say 'g'; 4 } say ':'.(f,g);"
f
g
:4
于 2012-08-23T12:57:22.897 に答える