文字列中に含まれる配列の変数展開

広告

ダブルクオーテーションで囲まれた文字列の中に変数を記述すると、変数が記述された位置に変数に格納された値が展開されます。同じように文字列中に配列をを記述すると、記述された位置に配列が展開されます。

配列は複数の要素を持っていますので、展開される時は要素が順にスペースで区切られて展開されます。

my @name = ("加藤", "山田", "林");
print "登録されているのは @name です";

文字列中の配列が展開が行われるのはダブルクオーテーションで囲まれた文字列だけです。シングルクオーテーションで囲まれた文字列の中に配列を記述しても、それは単なる文字として扱われるので配列とは認識されません。

my @name = ("加藤", "山田", "林");
print '登録されているのは @name です';

上記では画面に「登録されているのは @name です」と言う文字列が出力されます。

展開時の配列名と文字列の区切り

変数の場合と同じく文字列中に記述された配列名の直後にアルファベットや数字やアンダーバーが記述されている場合は、どこまでが配列名なのか区別ができず意図しない動作となってしまいます。これを防ぐには配列名の直後は変数名として使用できない空白などの文字を記述して変数がどこからどこまでなのかを明確にするか、配列名を括弧{}で囲んで記述します。

my @name = ("加藤", "山田", "林");
print "Hello,@{name}san";

このように記述することで文字列中の含まれる配列が「@name」であることを明確に表すことが出来ます。

特別変数「$"」

配列が展開される時、デフォルトではスペースで区切られて展開されますが、区切り文字は特別な変数「$"」に格納されている値が使用されます。デフォルトではスペースが格納されていますので、他の区切り文字を使って展開したい場合には変数「$"」に区切り文字を設定して下さい。

my @name = ("加藤", "山田", "林");
$" = ",";
print "登録されているのは @name です";

上記では画面に「登録されているのは 加藤,山田,林 です」と言う文字列が出力されます。

サンプルプログラム

では簡単なプログラムで確認して見ます。

test10-1.pl

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

my @name = ("加藤", "山田", "林");
print "登録されているのは @name です¥n";
print '登録されているのは @name です';

print "¥n";
$" = ",";
print "登録されているのは @name です¥n";

上記を「test10-1.pl」の名前で保存します(文字コードはUTF-8です)。そしてコマンドプロンプトを起動し、プログラムを保存したディレクトリに移動してから次のように実行して下さい。

文字列中に含まれる配列の変数展開

( Written by Tatsuo Ikura )