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

文字列中に配列を記述すると、配列が記述された位置に配列の要素を展開することができます。ここでは Perl の配列で文字列中に記述した配列の変数を展開して利用する方法を解説します。

(Last modified: )

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

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

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

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

この場合は次のように出力されます。

登録されているのは 加藤 山田 林 です

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

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

この場合は次のように出力されます。

登録されているのは @name です

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

変数の場合と同じく文字列中に記述された配列名の直後にアルファベットや数字やアンダーバーが記述されている場合は、どこまでが配列名なのか区別ができず意図しない動作となってしまいます。

下記では @name のあとにすぐに san と続いているため @nameasn という配列が記述されていると判断されてしまいます。

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

これを防ぐには配列名の直後は変数名として使用できない空白などの文字を記述して配列がどこまでなのかを明確にしてください。

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

または配列名を括弧 {} で囲んで記述することで文字列中の含まれる配列が @name であることを明確に表すことができます。

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

特別変数「$"」使って区切り文字を指定する

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

次の例では区切り文字としてカンマ(,)を指定したあとでは配列を文字列の中で展開しています。

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

この場合は各要素が空白ではなくカンマ(,)で区切って次のように出力されます。

登録されているのは 加藤,山田,林 です
サンプルコード

それでは簡単なサンプルを作成します。

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";

テキストエディタでプログラムを記述したあと sample.pl という名前で保存します。(文字コードは UTF-8 です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで次のように実行します。

perl sample.pl

次のように実行結果が表示されます。

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

配列をダブルクオーテーションで囲まれた文字列の中に記述した場合と、シングルクオーテーションで囲まれた文字列の中に記述した場合でそれぞれ変数展開されるかどうかを試しています。また展開されるときの区切り文字をデフォルトの空白からカンマ(,)に変えて変数展開しています。

-- --

Perl の配列で文字列中に記述した配列の変数を展開して利用する方法を解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。