スカラーコンテキストを強制する
scalar
は EXPR をスカラーコンテキストに強制し、EXPR の値を返します。
次の例では、1 つは配列の要素数を返しますが、もう一つは要素を連結した文字列を返してしまいます。
my @ary = ( 1, 2, 3 );
print scalar(@ary), "\n"; # 3
print @ary, "\n"; # "123"
次の例では 3 つの配列が定義されています。一方はそれぞれの配列の要素数を出力しますが、 もう一方は配列が展開されてしまい、配列の要素が出力されてしまいます。
my @a = ('あ');
my @b = ( 'あ', 'い' );
my @c = ( 'あ', 'い', 'う' );
my @counts1 = ( scalar @a, scalar @b, scalar @c );
print join( ', ', @counts1 ), "\n"; # 1, 2, 3
my @counts2 = ( @a, @b, @c );
print join( ', ', @counts2 ), "\n"; # あ, あ, い, あ, い, う
なお、リストコンテキストを強制する関数や演算子はありません。なぜなら必要ないからです。
もしリストコンテキストを強制したいなら、@{[ (some expression) ]}
を使うことができますが、通常は単に (some expression)
とするだけで十分です。
scalar
は単項演算子のため、EXPR にカッコつきのリストを使ってしまうと、
スカラーのカンマ式として扱われ、最後の要素だけではなく、すべての要素がボイドコンテキストで評価(実行)されてしまいます。
そして、最後の要素がスカラーコンテキストで評価されたうえで返されます。
恐らく、これはお望みの結果ではないはずです。
実際に例を見てみましょう。次の 1 行の命令文は
print uc(scalar(foo(), $bar)), $baz;
次の 2 行の命令文と同等です。
foo();
print(uc($bar), $baz);