9
my $mind = ( 'a', 'little', 'confused' );

そして、それperldoc perlfaq4は上記の行を次のように説明しているためです(強調が追加されています):

スカラーに割り当てているので、右側はスカラーコンテキストにあります。スカラーコンテキストのコンマ演算子(はい、演算子です!)は、左側を評価し、結果を破棄し、右側を評価して結果を返します。事実上、その リストそっくり$scalarさんはその右端の値に割り当てます。多くの人は、最後の要素が期待する数でもあるリストそっくりのものを選択するため、これを台無しにします。

my $scalar = ( 1, 2, 3 );  # $scalar gets 3, accidentally

これが意味することを私が理解しているのは、スカラーコンテキストにはリストのようなものがないということです。

ただし、ikegamiは、「結果はリスト演算子になるため、リストリテラルである」と主張しています。

それで、それはリストですか?

4

6 に答える 6

8

リストリテラルは、実際にはコードで書き出されたリストで(1, 2, 3)あり、リストリテラルでもありますcallerが、たとえば、コンテキストに応じてリストまたはスカラーを返す関数です。

次のような行で:

my $x = ...;

...スカラー コンテキストを参照するため...、リスト リテラルの場合は、スカラー コンテキストにリスト リテラルがあります。

my $x = (1, 2, 3);

しかし、リスト リテラルはリストにはなりません。リスト リテラルに含まれるコンマ演算子がスカラー コンテキストを認識し、リスト リテラルの最後の項目を返し、残りの値を評価後に破棄するためです。

関数に関しては、関数自体は、それが呼び出されたコンテキストを認識し、その関数内の戻り値の任意の行に伝達されます。したがって、スカラー、リスト、または無効なコンテキストで関数を使用できます。そのサブルーチンの最後の行がたまたまリスト リテラルである場合、そのリスト リテラルはそれらのコンテキストのいずれかを認識し、適切に動作します。

したがって、基本的にこれは用語の違いでありlist literal、実際のソース コード内のコンマで区切られた値のリストをlist参照し、perl のスタックに配置された一連の値を参照します。

コンテキストに関して配列またはリスト リテラルのように動作する戻り値を持つサブルーチンを作成できます。

sub returns_like_array  {my @x = 1..5; return @x}

sub returns_like_list   {my @x = 1..5; return @x[0 .. $#x]}

qw()*または、または太いコンマ=>、ハッシュまたは配列スライスなど、コンマ区切りの値のリストになるもの。

ここで私の答えを見ることもできます: Perl で配列を返す関数から最初の項目を取得するにはどうすればよいですか? リストについてもう少し詳しく説明します。

于 2011-11-22T20:22:17.837 に答える
3

あなたと に同意しますperlfaq4。を引用するperldataと、これはおそらくこの点に関する決定的なドキュメントです。

リスト値を必要としないコンテキストでは、リスト リテラルのように見えるものの値は、C のカンマ演算子と同様に、単に最後の要素の値です。

(強調鉱山)。

とはいえ、池上には好きな用語を使う権利がある。さまざまな人がさまざまな言語構造をさまざまな用語で考えています。最終結果が同じである限り、用語がドキュメントの用語と異なっていても問題ないと思います。(ただし、公開フォーラムで独特の用語を主張するのは良い考えではありません!)

于 2011-11-22T20:05:14.387 に答える
2

それは用語と視点の問題です。ソース コードでリストを記述したり、値のリストを返したり、リスト コンテキストで何かを評価したりできるため、ここでは用語がややこしくなります。また、「リスト」という単語は、それぞれの場合で微妙に異なる意味を持ちます。

技術的には、リストはスカラー コンテキストには存在できません。これは、perl (インタープリター) が次のような値のリストを作成しないためです。

my $x = ('a', 'b', 'c');

厳密に言えば、これはスカラーコンテキストでのコンマ演算子の動作として説明されています。同様に、qwはスカラー コンテキストの最後の要素を返すように定義されているため、ここにもリストはありません。

my $x = qw(a b c);

これらの両方のケース (および他の演算子の例についても同様) で、インタプリタは値のリストを作成しないということです。それは実装の詳細です。perl が値のリストを作成できず、最後のリスト以外をすべて破棄できない理由はありません。そうしないことを選択するだけです。

Perl は抽象言語です。ソース コード レベル('a', 'b', 'c')ではリストです。スカラー コンテキストを課す式でそのリストを使用できるため、その観点から、リストはスカラー コンテキストに存在できます。

最終的には、[Pp]erl がどのように動作するかのメンタル モデルの選択です。「スカラーコンテキストのリストは最後の値を返す」モデルは少し不正確ですが、理解するのは簡単です。私の知る限り、機能的に正しくないまれなケースはありません。「スカラー コンテキストにはリストのようなものはありません」モデルはより正確ですが、スカラー コンテキストですべての演算子の動作を考慮する必要があるため、操作が難しくなります。

于 2011-11-22T21:27:12.143 に答える
2

リストではありません。スカラーに割り当てているため、これはコンマ演算子です。左側を評価し、右側を評価し、右側を返し、左から右に解決します。$scalarになります'confused':)

于 2011-11-22T20:01:20.190 に答える
1

スカラー コンテキストのリストを信じるなら、手を叩いてください

于 2011-11-23T09:08:19.330 に答える