Perl5 perldata - Perl のデータ構造
[変数名][コンテキスト][スカラ値][スカラ値の構成][リスト値の構成][データ型]
-
リスト値の構成
-
リスト値は、個々の値をコンマで区切って (必要に応じて括弧で括って) 示されます:
(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 となり、偽として解釈されるからです。
出典:Perl manpages Last change: Release 5.0 Patchlevel 00 5