Perlのスカラーコンテキストとリストコンテキストの違いは何ですか?これは、JavaやJavascriptなどの他の言語との類似点がありますか?
3 に答える
Perlのさまざまな演算子はコンテキストに依存し、リストコンテキストとスカラーコンテキストで異なる結果を生成します。
例えば:
my(@array) = (1, 2, 4, 8, 16);
my($first) = @array;
my(@copy1) = @array;
my @copy2 = @array;
my $count = @array;
print "array: @array\n";
print "first: $first\n";
print "copy1: @copy1\n";
print "copy2: @copy2\n";
print "count: $count\n";
出力:
array: 1 2 4 8 16
first: 1
copy1: 1 2 4 8 16
copy2: 1 2 4 8 16
count: 5
今:
$first
1(配列の最初の要素)が含まれます。これは、の括弧がmy($first)
配列コンテキストを提供するためですが、の1つの値にはスペースしかありません$first
。- 両方
@copy1
と@copy2
のコピーが含まれています@array
、 - スカラーコンテキストで
$count
あるため5が含まれ@array
、スカラーコンテキストの配列内の要素の数に評価されます。
より複雑な例を作成することもできます(結果は読者の練習問題です)。
my($item1, $item2, @rest) = @array;
my(@copy3, @copy4) = @array, @array;
私が知っている他の言語では、リストとスカラーのコンテキストに直接対応するものはありません。
スカラーコンテキストは、単一の値を探しているときに得られるものです。リストコンテキストは、複数の値を探しているときに得られるものです。違いを確認する最も一般的な場所の1つは、アレイを操作する場合です。
@x = @array; # copy an array
$x = @array; # get the number of elements in an array
他の演算子と関数もコンテキストに依存します。
$x = 'abc' =~ /(\w+)/; # $x = 1
($x) = 'abc' =~ /(\w+)/; # $x = 'abc'
@x = localtime(); # (seconds, minutes, hours...)
$x = localtime(); # 'Thu Dec 18 10:02:17 2008'
演算子(または関数)が特定のコンテキストでどのように動作するかは、演算子次第です。物事がどのように振る舞うべきかについての一般的な規則はありません。
wantarray
関数を使用して呼び出し元のコンテキストを判別することにより、独自のサブルーチンをコンテキスト依存にすることができます。scalar
キーワードを使用して、式を強制的にスカラーコンテキストで評価することができます。
スカラーコンテキストとリストコンテキストに加えて、ドキュメントに記載されている「void」(戻り値は期待されない)および「boolean」(真/偽の値が期待される)コンテキストも表示されます。
これは単に、データ型が操作のモードに基づいて評価されることを意味します。たとえば、スカラーへの割り当ては、右側がスカラーとして評価されることを意味します。
コンテキストを理解する最良の方法は、wantarrayについて学ぶことだと思います。したがって、=がwantarrayを実装するサブルーチンであると想像してください。
sub = {
return if ( ! defined wantarray ); # void: just return (doesn't make sense for =)
return @_ if ( wantarray ); # list: return the array
return $#_ + 1; # scalar: return the count of the @_
}
この投稿の例は、右側をパラメーターとして渡すことにより、上記のサブルーチンが呼び出されたかのように機能します。
他の言語の類似点については、はい、私はまだ事実上すべての言語が同様のものをサポートしていると主張しています。ポリモーフィズムはすべてのオブジェクト指向言語で類似しています。別の例として、Javaは特定のコンテキストでオブジェクトを文字列に変換します。そして、私が使用したすべての型指定されていないスクリプト言語には、同様の概念があります。