スカラーコンテキストとリストコンテキスト

Perlが式を解析する際、スカラー値かリスト値のどちらかを期待する。その期待するものが、その式のコンテキスト。同じ式であっても、状況に応じて、返される結果が異なる。

#!/usr/bin/perl;
@list = qw/ a b c /;
($a) = @list;  # リストコンテキスト
$b = @list;    # スカラーコンテキスト
print "$a\n";
print "$b\n";
a
3

配列はリストコンテキストでは、その要素を返すが、スカラーコンテキストでは、その要素数を返す。

スカラーを生成する式をリストコンテキストで使う。

#!/usr/bin/perl -w
@list = 4 * 6 # (24)というリストが代入される
print "$list[0]\n";
24

スカラー値を返す式をリストコンテキストで使うと、その式のスカラー値が1要素のリストに変換される。

リストを生成する式をスカラーコンテキストで使う。

#!/usr/bin/perl -w
$str = reverse qw/ tale oil cost /;
print "$str\n";
tsoclioelat

reverse演算子スカラーコンテキストで使うと、全ての要素を連結した文字列を、逆順にしたものを返す。sort演算子は、スカラーコンテキストでは常にundefを返す。単純に配列の要素数を返すわけではないらしい。

スカラーコンテキストを強制する

リストコンテキストを強制的にスカラーコンテキストに
変えるには、擬似関数scalarを使う。

#!/usr/bin/perl -w
@list = qw/ Tom Jack Fred /;
print "I have " , @list, " brothers.\n";
print "I have ", scalar @list, " brothers.\n";
I have TomJackFred brothers.
I have 3 brothers.

print演算子はリストコンテキストを提供するので、配列があると、その要素を順番に表示する。だからこの場合は、scalarを使って、強制的に要素数を返すようにしている。