12

スカラー コンテキストでのリスト代入は、右側の要素の数を返します。

scalar(my ($hello, $there, $world) = (7,8)); #evaluates to 2

新しく定義されたリストが評価されて 3 を返すのではなく、右辺を評価して 2 を生成するのはなぜですか?

私には、$hellogets 7、$theregets 8、および$worldgetsundefのように見えます。その後、そのリストはスカラー コンテキストで評価され、結果は 3 になります。これは、リスト ( $hello $there $world) 内の要素の数であるためです。コンテキストが評価された式のどの部分が返されるかに影響するのは私には奇妙に思えます:

my $greeting = (($hello, $there, $world) = (7,8)); #2

my @greeting = (($hello, $there, $world) = (7,8));
my $greeting_length = @greeting; #3
4

3 に答える 3

15

perlop(代入演算子セクションの最後の文)の右側の要素を数えることが文書化されています。

同様に、リストコンテキストでのリスト割り当ては、に割り当てられた左辺値のリストを生成し、スカラーコンテキストでのリスト割り当ては、割り当ての右側の式によって生成された要素の数を返します。

それがそのように機能する理由は、あなたがこのようなことを書くことができるようにするためです:

while (my ($key, $value) = each %hash) { ... }

割り当ての左側にある要素の数を数えた場合、それは無限ループになります。

考えてみると、左側の要素数は右側と同じか、定数です(スカラーのリストに割り当てる場合)。前者の場合、どちら側を数えるかは違いがなく、後者の場合、右側を数える方が便利です。

一方、リストコンテキストでは、代入演算子は左側のリストを返します。これは、より便利だからです。リスト要素を変更するコンテキストで使用する場合は、割り当てられたばかりの変数を変更する必要があります。

Re:あなたのコメント あなたの例で(7,8)は、2要素のリストです。これが代入演算子が2を返す理由です。短いリストを長いスカラーのリストに割り当てると、右側はundef前に「埋め込まれ」ません。割り当てが発生します。代わりに、右側のリストから値が関連付けられていない変数は、デフォルト値にリセットされます。スカラー変数の場合、それはundefです。配列の場合、それは空の配列です。ハッシュの場合、それは空のハッシュです。

于 2012-02-16T07:37:23.480 に答える
6
コンテキストがどちらの側が評価されるかに影響するのは私には奇妙に思えます:

そうではありません。リスト代入演算子の両側 (オペランド) が評価され、リスト代入がスカラー コンテキストで評価されるかリスト コンテキストで評価されるかは、オペランドの評価にまったく影響しません。

リスト代入がスカラー コンテキストで評価されるかリスト コンテキストで評価されるかは、返される値にのみ影響します。

私は以前にScalar vs List Assignment Operatorを作成しました。これは、2 つの代入演算子の違いと、スカラーとリストのコンテキストでの動作を明確にすることを目的としています。

于 2012-02-16T08:55:34.790 に答える