Perl のスカラー コンテキストとリスト コンテキストの違いは何ですか?
質問
Perl のスカラー コンテキストとリスト コンテキストの違いは何ですか?これは Java や Javascript などの他の言語でも類似点はありますか?
解決
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;
私が知っている他の言語には、リストおよびスカラー コンテキストに直接類似したものはありません。
他のヒント
スカラコンテキストでは、単一の値を探しているとき、あなたが得るものです。リストコンテキストでは、複数の値を探しているとき、あなたが得るものです。配列を扱うときに違いを見るための最も一般的な場所の一つは、次のとおりです。
@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
キーワードを使って、スカラーコンテキストで評価される式を強制することができます。
スカラーとリストコンテキストに加え、あなたはまた、ドキュメントに記載の状況(予想真/偽値)「空」(なし戻り値は期待できない)と「ブール」を参照してくださいよ。
これは単にデータ型の動作モードに基づいて評価されることを意味します。例えば、スカラーへの代入は、右側はスカラーとして評価されることを意味します。
私は理解コンテキストの最良の手段は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 @_
}
例href="https://stackoverflow.com/questions/376921/what-is-the-difference-between-the-scalar-and-list-contexts-in-perl#376933">この記事の仕事上のサブルーチンをパラメータとして、右サイドを渡すことによって呼び出されたかのように。
他の言語の類似点については、はい、私はまだ、ほぼすべての言語は似たようなをサポートしていることを維持します。多型は、すべてのオブジェクト指向言語で同様です。別の例は、Javaは、特定のコンテキストで文字列にオブジェクトを変換します。そして、私が使用したすべての型指定されていないスクリプト言語は、同様の概念を持っています。