perlでは、(ほとんどのプログラミング言語のように)優先順位をオーバーライドするため、およびリストを作成するために括弧が使用されます。特定のペアの親がグループ化構成として扱われるのか、1要素リストとして扱われるのかをどのように判断できますか?
たとえば、これはスカラーであり、1要素のリストではないと確信しています。(1 + 1)
しかし、より複雑な式についてはどうでしょうか。簡単に見分ける方法はありますか?
perlでは、(ほとんどのプログラミング言語のように)優先順位をオーバーライドするため、およびリストを作成するために括弧が使用されます。特定のペアの親がグループ化構成として扱われるのか、1要素リストとして扱われるのかをどのように判断できますか?
たとえば、これはスカラーであり、1要素のリストではないと確信しています。(1 + 1)
しかし、より複雑な式についてはどうでしょうか。簡単に見分ける方法はありますか?
ここでは、次の 3 つの重要な原則が役立ちます。
コンテキストは王様です。あなたの例の評価は(1 + 1)
、コンテキストによって異なります。
$x = (1 + 1); # Scalar context. $x will equal 2. Parentheses do nothing here.
@y = (1 + 1); # List context. @y will contain one element: (2).
# Parens do nothing (see below), aside from following
# syntax conventions.
スカラー コンテキストでは、 list のようなものはありません。これを確認するには、リストのように見えるものをスカラー変数に割り当ててみてください。これについて考える方法は、コンマ演算子の動作に注目することです。スカラー コンテキストでは、コンマ演算子は左の引数を評価し、その値を破棄し、次に右の引数を評価して、その値を返します。リスト コンテキストでは、コンマ演算子は両方の引数をリストに挿入します。
@arr = (12, 34, 56); # Right side returns a list.
$x = (12, 34, 56); # Right side returns 56. Also, we get warnings
# about 12 and 34 being used in void context.
$x = (@arr, 7); # Right side returns 7. And we get a warning
# about using an array in a void context.
括弧はリストを作成しません。コンマ演算子はリストを作成します (リスト コンテキストにいる場合)。Perl コードでリストを入力するときは、リストを作成するためではなく、優先順位のために括弧が必要です。いくつかの例:
括弧は効果がありません。配列をスカラー コンテキストで評価しているため、右側は配列サイズを返します。
$x = (@arr);
要素が 1 つのリストを作成する場合、括弧は必要ありません。
@arr = 33; # Works fine, with @arr equal to (33).
ただし、優先順位の理由から、複数の項目には括弧が必要です。
@arr = 12, 34, 56; # @arr equals (12). And we get warnings about using
# 34 and 56 in void context.
例:
$x = 1 + 1; # $x is 2.
$x = (1 + 1); # $x is 2.
@x = 1 + 1; # @x is (2).
@x = (1 + 1); # @x is (2).
$x = (1 + 1, 1 + 2); # $x is 3.
@x = (1 + 1, 1 + 2); # @x is (2, 3).
大まかに言えば、リスト コンテキストでは、コンマ演算子はリストの項目を区切ります。スカラー コンテキストでは、コンマ演算子は C の「シリアル コンマ」であり、左側と右側を評価し、右側の値を返します。スカラーコンテキストでは、括弧は式をグループ化して操作の順序をオーバーライドします。リストコンテキストでは、括弧は...まったく同じことを行います。配列への割り当てに関連する理由は次のとおりです。
# Comma has precedence below assignment.
# @a is assigned (1), 2 and 3 are discarded.
@a = 1, 2, 3;
# @a is (1, 2, 3).
@a = (1, 2, 3);
あなたの質問「それはスカラーですか、それとも1要素のリストですか」については、コンテキストのために、式を単独で尋ねるのは意味のある質問ではありません。リスト コンテキストでは、すべてがリストです。スカラーコンテキストでは、何もありません。