37

私は時々このようなPerlコードを見ます:

my ( $variable ) = blah....

単一の変数を括弧で囲むことのポイントは何ですか?括弧は、次のような複数の変数を宣言する場合にのみ使用されると思いました。

my ( $var1, $var2, $var3 ) = blah...
4

5 に答える 5

47

違いがある場合、いくつかのシナリオがあります。

  1. 配列が右側の場合

    my @array = ('a', 'b', 'c');
    my  $variable  = @array;           #  3   size of @array
    my ($variable) = @array;           # 'a'  $array[0]
    
  2. リストが右側の場合

    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
    
  3. 変数 (配列/スカラー) の戻り値を持つサブルーチン

    sub myFunction {
      ...
      return (wantarray() ? @array : $scalar);
    }
    my  $variable  = myFunction(...);  # $scalar   from the subroutine
    my ($variable) = myFunction(...);  # $array[0] from the subroutine
    
于 2012-04-05T18:39:48.443 に答える
21

括弧は、割り当ての右側がどのように評価されるかに影響するリスト コンテキストを作成します。

比較

my $x = grep { /s/ } qw(apples bananas cherries);
print $x;

my ($x) = grep { /s/ } qw(apples bananas cherries);
print $x;

リストの最初の要素を取得して残りを破棄したい場合に、この構造をよく使用します。

于 2012-04-05T15:32:15.717 に答える
7

あなたは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
于 2012-04-05T15:50:59.433 に答える
7

私は Perl のプロではありませんが (もちろんそうではありません)、私の知る限り、それはリストに関係しています。Perl にはさまざまなコンテキスト (スカラー、リスト) があります。($var)スイッチを使用してコンテキストをリストする$varと、スカラー コンテキストになります。

my $var = (1, 2, 4); # $var = 4 (last element)
my ($var) = (1, 2, 4); # $var = 1

完全に間違っている場合は、この回答に反対票を投じてください:)

于 2012-04-05T15:29:30.090 に答える
2

この件については、別のサイトで詳しい説明を掲載しています。

【ここには掲載できません。StackOverflow はテーブルをサポートしていません。通常、ドキュメンテーションへのオフサイト リンクに問題がある人は誰もいないというわけではありません。]

于 2012-04-05T20:12:36.347 に答える