Go to the first, previous, next, last section, table of contents.


リスト値の構成

リスト値は、個々の値をコンマで区切って (必要に応じて括弧で括って) 示され ます:

(LIST)

リスト値が要求されていないコンテキストでは、リストリテラルの値としては、 C のコンマ演算子の場合のように、最後の要素の値が使われます。たとえば、

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

は、リスト値全体を配列 @foo に代入しますが、

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

は、変数 $bar の値を変数 $foo に代入します。本物の配列がス カラコンテキストで評価されたときの値は、その配列の大きさとなります。以下 の例では、$foo に 3 という値が代入されます:

@foo = ('cc', '-E', $bar);
$foo = @foo;                # $foo は 3 となる

リストリテラルの閉じ括弧の前には余分にコンマを置いてかまいませんので、

@foo = (
    1,
    2,
    3,
);

と書くことができます。

リストの中にリストがある場合には、自動的に展開されてしまいます。これは、 外側のリストが評価されると、リストの個々の要素がリストコンテキストで評価 され、その結果のリスト値の個々の値が、元のリストの要素であるかのように展 開されるのです。つまり、リストの中では配列も、その性質が現れてきません。

(@foo,@bar,&SomeSub)

というリストは、@foo のすべての要素の後に @bar のすべて の要素を続け、その後に SomeSub というサブルーティンが返すすべての要素を 続けたものを要素として持ちます。展開されないリストのリファレンスを作るた めには、perlref manpage を参照してください。

空リストは () で表わされます。リスト中で空リストを展開しても何も起こりま せん。つまり、 ((),(),()) は () と等価です。同様に、要素のない配列を展開 することは、その場所に何も展開しなかったのと同じことになります。

リスト値にも通常の配列と同じように、添え字をつけることができます。リスト には、曖昧さをなくすために、括弧を付けなくてはなりません。例:

# stat はリスト値を返す
$time = (stat($file))[8];

# 16 進の数字を探す
$hexdigit = ('a','b','c','d','e','f')[$digit-10];

# 「逆コンマ演算子」
return (pop(@foo),pop(@foo))[0];

リストを構成する個々の要素すべてに代入が許される場合には、全体のリストに 代入を行なうことができます:

($a, $b, $c) = (1, 2, 3);

($map{'red'}, $map{'blue'}, $map{'green'})
                                = (0x00f, 0x0f0, 0xf00);

リストの最後の要素は、配列やハッシュでもかまいません:

($a, $b, @rest) = split;
local($a, $b, %rest) = @_;

実際は、リストの任意の要素として配列を使うことができますが、リスト中の最 初の配列が、右辺の値をすべて取り込んでしまうため、それ以降のものはヌルし か受け取ることができません。これは、local() や my() では有用かもしれませ ん。

ハッシュリテラルは key と value と解釈される値のペアで構成されます:

# 上記の map の代入と同じ
%map = ('red',0x00f,'blue',0x0f0,'green',0xf00);

key と value のペアの間には => 演算子を使うと読みやすくなります (実際のところ => 演算子は、見た目に目立つコンマの同義語でしかあり ません):

%map = (
         'red'   => 0x00f,
         'blue'  => 0x0f0,
         'green' => 0xf00,
       );

スカラコンテキストにおける配列代入は、代入の右辺の式で作られる要素の数を 返します:

$x = (($foo,$bar) = (3,2,1));       # $x は 2 ではなく 3

これは、ブールコンテキストでリストの代入を行ないたい時に、とても便利です。 多くのリスト関数は最終的に空リストを返し、それが代入されると 0 となり、 偽として解釈されるからです。


Go to the first, previous, next, last section, table of contents.

検索式: