31

Perl のコンテキストを理解しようとしていて、岩につまずきました。

コードを考えると;

#!/usr/bin/perl

my $b = (33,22,11);
print "$b\n";

my $b = () = (33,22,11);
print "$b\n";

my @b = (33,22,11);
print "@b\n";

my @b = () = (33,22,11);
print "@b\n";

結果は次のとおりです (最後の行は空白です)。

 11  

 3 

 33 22 11

 <>

2 番目の出力ではリストの長さが返されたので、スカラー コンテキスト内の配列はその長さに評価されるため、どこかで配列が生成されたと想定していました。しかし、第 4 版はその仮定を裏切っているようです。印刷されることを期待していまし'33 22 11'たが、代わりに何も得られませんでした。ここで何が起こっているのですか?

4

3 に答える 3

3

タイトルの暗黙の質問に答える:

Perl は、他のscalar方法では使用されない場合にスカラー コンテキストを強制するビルトインを提供します。同様のlistビルトインは存在しませんが、主にそれが多くの異なることを意味する可能性があるためだと思います。

list { code to execute in list context };

次のように定義できます。

sub list (&) { scalar( () = $_[0]->() ) } # return count of elements
sub list (&) { ( $_[0]->() )[0] } # return first element
sub list (&) { ( $_[0]->() )[-1] } # return last element
sub list (&) { for( $_[0]->() ) {} } # return nothing

質問の本文に答える:

コンテキストに混乱した場合は、演算子がオペランドにコンテキストを課すのであって、その逆ではないことに注意してください。問題のケースでは、スカラー割り当てがあり、リスト割り当ての結果をスカラーに割り当て、リスト割り当てをスカラーコンテキストに配置します。何が起こるかを知るには、リスト代入がスカラー コンテキストで何を返すかを調べるだけです。(一般に、演算子は最も一般的なものを返します。つまり、すべての演算子に適用される覚えやすい規則はありません。)

于 2013-06-16T20:26:19.847 に答える