変数展開時の変数名と文字列の区切り
文字列中に変数展開を行う場合には注意する点があります。次の例で考えみます。
my $name = "加藤"; print "Hello,$namesan";
上記の場合、文字列中に変数が含まれていますが、変数名として「$name」ではなく「$namesan」と言う変数に格納されている値を展開しようとします。変数の展開は宣言されている変数を検索して行うといったものではなく、文字列中に含まれていて「$」から開始し、変数名として使用できるアルファベットや数字やアンダーバーが途切れるまでを変数名としてみなします。
その為、変数名の直後にアルファベットや数字やアンダーバーが記述されている場合は、意図していない変数として扱われてしまいます。これを防ぐには変数名の直後は変数名として使用できない空白などの文字を記述して変数がどこからどこまでなのかを明確にします。
my $name = "加藤"; print "Hello,$name san";
ただしこの方法では変数名の直後にアルファベットや数字を記述できません。そこで直後にアルファベットや数字を記述したい場合は変数名を括弧{}で囲んで記述します。
my $name = "加藤"; print "Hello,${name}san";
このように記述することで文字列中の含まれる変数が「$name」であることを明確に表すことが出来ます。
サンプルプログラム
では実際に試してみます。
use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; my $name = "加藤"; print "Hello,$name san¥n"; print "Hello,${name}san¥n";
上記を「test9-1.pl」の名前で保存します(文字コードはUTF-8です)。そしてコマンドプロンプトを起動し、プログラムを保存したディレクトリに移動してから次のように実行して下さい。
どちらの場合も文字列中の変数展開が正常に行われています。
( Written by Tatsuo Ikura )