私は時々このようなPerlコードを見ます:
my ( $variable ) = blah....
単一の変数を括弧で囲むことのポイントは何ですか?括弧は、次のような複数の変数を宣言する場合にのみ使用されると思いました。
my ( $var1, $var2, $var3 ) = blah...
私は時々このようなPerlコードを見ます:
my ( $variable ) = blah....
単一の変数を括弧で囲むことのポイントは何ですか?括弧は、次のような複数の変数を宣言する場合にのみ使用されると思いました。
my ( $var1, $var2, $var3 ) = blah...
違いがある場合、いくつかのシナリオがあります。
配列が右側の場合
my @array = ('a', 'b', 'c');
my $variable = @array; # 3 size of @array
my ($variable) = @array; # 'a' $array[0]
リストが右側の場合
my $variable = qw/ a b c d /; # 'd' last item of the list
my ($variable) = qw/ a b c d /; # 'a' first item of the list
変数 (配列/スカラー) の戻り値を持つサブルーチン
sub myFunction {
...
return (wantarray() ? @array : $scalar);
}
my $variable = myFunction(...); # $scalar from the subroutine
my ($variable) = myFunction(...); # $array[0] from the subroutine
括弧は、割り当ての右側がどのように評価されるかに影響するリスト コンテキストを作成します。
比較
my $x = grep { /s/ } qw(apples bananas cherries);
print $x;
と
my ($x) = grep { /s/ } qw(apples bananas cherries);
print $x;
リストの最初の要素を取得して残りを破棄したい場合に、この構造をよく使用します。
あなたは2つの異なることを混同しています。まず、my
複数の変数を宣言するために使用する場合、括弧を使用する必要があります。
my $foo, $bar;
2 つの異なるステートメントと見なされるため、機能しません。
my $foo;
$bar;
したがって、引数を関数 の引数リストにグループ化するには、括弧が必要ですmy
。
my($foo, $bar);
次に、リスト コンテキストを呼び出すための明示的なグループ化があります。
$foo, $bar = "a", "b"; # wrong!
3 つの別個のステートメントと見なされます。
$foo;
$bar = "a";
"b";
しかし、括弧を使用してグループ$foo
化$bar
してリストにすると、代入演算子はリスト コンテキストを使用します。
($foo, $bar) = ("a", "b");
興味深いことに、RHS の括弧を削除すると、ヒックアップも発生します。
($foo, $bar) = "a", "b"; # Useless use of a constant (b) in void context
しかし、これはperlopでわかるように、=
演算子がコンマよりも優先順位が高いためです。試してみると:,
my @array = ("a", "b");
($foo, $bar) = @array;
括弧なしで目的の動作が得られます。
円を完成させるために、上記のリスト コンテキストを削除して、何が起こるか見てみましょう。
my @array = ("a", "b");
$foo = @array;
print $foo;
2
配列はスカラー コンテキストで評価され、スカラー コンテキストの配列は含まれる要素の数を返すため、これは を出力します。この場合は です2
。
したがって、次のようなステートメントはリスト コンテキストを使用します。
my ($foo) = @array; # $foo is set to $array[0], first array element
my ($bar) = ("a", "b", "c"); # $bar is set to "a", first list element
これは、スカラー割り当てで暗示されるスカラー コンテキストをオーバーライドする方法です。比較のために、これらの割り当てはスカラー コンテキストにあります。
my $foo = @array; # $foo is set to the number of elements in the array
my $bar = ("a", "b", "c"); # $bar is set to "c", last list element
私は Perl のプロではありませんが (もちろんそうではありません)、私の知る限り、それはリストに関係しています。Perl にはさまざまなコンテキスト (スカラー、リスト) があります。($var)
スイッチを使用してコンテキストをリストする$var
と、スカラー コンテキストになります。
my $var = (1, 2, 4); # $var = 4 (last element)
my ($var) = (1, 2, 4); # $var = 1
完全に間違っている場合は、この回答に反対票を投じてください:)
この件については、別のサイトで詳しい説明を掲載しています。
【ここには掲載できません。StackOverflow はテーブルをサポートしていません。通常、ドキュメンテーションへのオフサイト リンクに問題がある人は誰もいないというわけではありません。]