MTでPerlを学ぶ(その4・変数展開とヒアドキュメント)

「MTでPerlを学ぶ」の第4回として、文字列を扱う際に便利な「変数展開」と「ヒアドキュメント」をお話します。

1.変数展開

前回、文字列を表す方法として、「'」で囲む書き方と「"」で囲む書き方があることをお話ししました。
その際に、両者の違いはエスケープシーケンスが変換されるかどうかと述べました。
それとともに、もう1つの違いとして、「変数展開が行われるかどうか」という点もあります。

変数展開というのは、文字列中に書いた変数が、その変数の値に置き換えられることを指します。
「"」で文字列を囲むと、変数展開が行われます。
一方、「'」で文字列を囲んだ場合は、変数展開は行われません。

例えば、以下のようなプログラムを考えてみます。

$name = 'Taro';
$msg = "Hello, $name";
print $msg;

上記を含むインデックステンプレートのサンプルをダウンロード

2行目の文を見ると、文字列の中に「$name」があります。
この「$name」は、変数$nameの値に置き換えられます。
上のプログラムでは、変数$nameには「Taro」という文字列を代入していますので、変数$msgには「Hallo, Taro」が代入されます。

2.ヒアドキュメント

プログラムの中で、改行を含む長い文字列を扱うこともよくあります。
その場合、文字列を「"」で囲み、「\n」のエスケープシーケンスで改行を表すことができます。
例えば、以下のように書くことができます。

$a = "This is a pen.\nThat is a dog.";

ただ、この書き方だと、長い文字列を表すには面倒ですし、改行の位置を把握しにくいです。
このようなときに便利なのが、「ヒアドキュメント」(here document)という書き方です。

ヒアドキュメントは、「<<識別子;」と「識別子」の間に書いた文字列を、改行も含めてそのまま扱うことができる機能です。
識別子は、大文字の英単語で表すことが一般的です。

例えば、上にあげた例をヒアドキュメントで書くと、以下のように書くことができます。
識別子に「HERE」を使っていますが、HERE以外の単語でも構いません。

$a = <<HERE;
This is a pen.
That is a dog.
HERE

3.ヒアドキュメントとエスケープシーケンス/変数展開の併用

ヒアドキュメントの中で、エスケープシーケンスや変数展開を使うこともできます。
例えば、以下のプログラムを実行すると、ヒアドキュメント内の「$name」は変数$nameの値(Taro)に置き換えられます。
したがって、変数$msgの値は「Hello, Taro(改行)Nice to meet you.」になります。

$name = 'Taro';
$msg = <<HERE;
Hello, $name
Nice to meet you.
HERE
print $msg;

上記を含むインデックステンプレートのサンプルをダウンロード

なお、ヒアドキュメントの中でエスケープシーケンスや変数展開を行わないようにしたい場合、「<<識別子;」の識別子を「'」で囲みます。
例えば、上のプログラムの2行目を「$msg = <<'HERE';」に変えると、変数展開は行われなくなります。