scalar

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

構文

解説

scalarEXPR をスカラーコンテキストに強制し、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);