2

perldata で、次の例と説明を見つけました。

@foo = ('cc', '-E', $bar);

assigns the entire list value to array @foo, but

$foo = ('cc', '-E', $bar);

assigns the value of variable $bar to the scalar variable $foo. 

これは本当に私を混乱させるので$foo$bar? との違いを理解する@foo方法$foo

4

2 に答える 2

6

perldataの例:

@foo = ('cc', '-E', $bar);
$foo = ('cc', '-E', $bar);

リストコンテキストを作成するため@foo、parensのすべての値がに割り当てられ@fooます。$foo一方、スカラーであるため、スカラーコンテキストにあるため、リストの最後の要素のみが割り当てられます。

それは言うことと同じです:

'cc', '-E';
$foo = $bar;

Perlでは、のようなスカラー$fooは単一の値しか保持できないため、リストの残りの部分は単に破棄されます。のような配列は@foo、リストが保持するのと同じ数の値を丸呑みします。

Perlでは、異なるタイプの変数に同じ名前を付けることができます。@fooそして、$foo2つの異なる変数と見なされます。

于 2011-12-22T04:18:31.527 に答える
3

式は、評価されるコンテキストに応じて異なる意味を持つことができます。主な 3 つのコンテキストは、リスト、スカラー、および void ですが、スカラー コンテキストにはいくつかのサブコンテキストが存在します (ブール値、文字列、および数値が最も重要なものです)。 .

コンマ演算子もこの規則の例外ではありません。リスト コンテキストでは、カンマ演算子はリスト連結演算子として機能し、そのオペランドをリスト コンテキストで評価し、結果のリストを 1 つのリストに結合します。これは、コンマ演算子を扱うときによく知っているコンテキストです。

ただし、スカラー コンテキストでは、コンマ演算子は C のコンマ演算子と同じように機能します。一連の式を評価し、返される一番右の式を除いて、その結果を破棄します (補足として、破棄される式は無効なコンテキストで評価され、返される式はスカラー コンテキストで評価されます)。各 perl オペレーターがさまざまなコンテキストでどのように動作するかを学ぶには、perlopを読むことをお勧めします。

コンテキストを完全に理解するには、最も外側の演算子がそのオペランドにコンテキストを適用し、その演算子がそのオペランドにコンテキストを適用する、ということを認識する必要があります (別の補足: 行の最も外側の式は常に無効なコンテキスト)。したがって、たとえば、割り当て演算子が配列またはハッシュ変数 (% または @ で始まる) で使用されている場合、割り当ての右側は結果としてリスト コンテキストで評価されます。ただし、変数がスカラーの場合、代入の右側は代わりにスカラー コンテキストで評価されます。これが、以下の割り当てでコンマ演算子を使用する理由です。

@foo = ('cc', '-E', $bar);
$foo = ('cc', '-E', $bar);

まったく異なる方法で行動します。

コンテキストを制御または反応するコードを作成する方法の詳細については、スカラー演算子と wantarray 演算子についてお読みください。

于 2011-12-22T11:47:09.860 に答える