ヒアドキュメントを使って複数行の文字列を記述する

Perl で用意されているヒアドキュメントを使用すると複数行の文字列を簡単に記述することができます。ここでは Perl のプログラムの中でヒアドキュメントを使って複数行の文字列を記述する方法について解説します。

(Last modified: )

ヒアドキュメントの使い方

Perl で複数行の文字列を記述する場合、文字列の中に改行を表す \n を追加して次のように記述します。

"文字列\n文字列\n文字列"

比較的短い文字列であればこれで構いませんが、長い複数行の文字列を記述する方法として Perl ではヒアドキュメントと呼ばれる書式が用意されています。書式は次の通りです。

<< "EOF";
文字列
文字列
文字列
EOF

<< "EOF"; から EOF までに記述された複数行の文字列を作成します。ここで "EOF" は終端文字列と呼ばれるもので、どこからどこまでがヒアドキュメントなのかを表すために使います。終端文字列は対になっていればどのような文字列でも構いません。例えば "EOF" の代わりに "BLOCK" でも構いません。

<< "BLOCK";
文字列
文字列
文字列
BLOCK

ヒアドキュメントを注意点としてセミコロンを記述する位置に注意してください。最後ではなく最初の終端文字列のあとに記述します。

具体的には次のように使います。

my $str = << "EOF";
こんにちは。
お元気ですか。
さようなら。
EOF

ヒアドキュメントを使った記述した文字列を変数に格納しています。

サンプルコード

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

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

my $str1 = << "EOF";
Hello
Thank, you
Bye!
EOF

my $str2 = "Hello\\nThank, you\\nBye!";

print $str1;
print $str2;

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

perl sample.pl

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

ヒアドキュメントの使い方(1)

ヒアドキュメントを使って作成した複数行の文字列と、通常の文字列で途中い改行文字を入れて作成した複数行の文字列をそれぞれ画面に出力しました。

ヒアドキュメント内の変数展開

ヒアドキュメントを作成するときに、終端文字列をダブルクォーテーションで囲った場合はヒアドキュメント内に記述した変数が変数展開されます。下記では終端文字列を "EOF" のようにダブルクォーテーションで囲っています。

my $name = "山田";
my $msg = << "EOF";
$name さん。
こんにちは。
EOF

この場合はヒアドキュメント内の $name が変数展開されて "山田" に置き換わります。

終端文字列をシングルクォーテーションで囲った場合はヒアドキュメント内に記述した変数は変数展開されません。下記では終端文字列を 'EOF' のようにシングルクォーテーションで囲っています。

my $name = "山田";
my $msg = << 'EOF';
$name さん。
こんにちは。
EOF

この場合はヒアドキュメント内の $name はそのまま "$name" という文字列として使用されます。

サンプルコード

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

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

my $name = "山田";

my $msg1 = << "EOF";
$name さん。
こんにちは。
EOF

my $msg2 = << 'EOF';
$name さん。
こんにちは。
EOF

print $msg1;
print $msg2;

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

perl sample.pl

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

ヒアドキュメント内の変数展開(1)

ヒアドキュメントの終端文字列をダブルクォーテーションで囲った場合は変数展開が行われますが、シングルクォーテーションで囲った場合は変数展開が行われません。

終端文字列のインデント

ヒアドキュメントを記述する場合、文字列の先頭に含まれるスペースもそのまま文字列として扱われます。例えば次の例を見てください。

<< "EOF";
    こんにちは。
      さようなら。
EOF

この文字列を画面に出力すると、次のように表示されます。

    こんにちは。
      さようなら。

ヒアドキュメントの中の文字列の空白文字を無視させたい場合は、 << のあとに ~ を追加して <<~ を使います。そして最後の終端文字列の位置を右へずれしてください。終端文字列の先頭の位置が基準となり、それより前の位置の空白は無視されます。次の例をみてください。

<<~ "EOF";
    こんにちは。
      さようなら。
    EOF

この文字列を画面に出力すると、次のように表示されます。

こんにちは。
  さようなら。

最後の "EOF" の位置が基準となるため、それより前にある 4 文字分の空白は無視されます。

サンプルコード

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

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

my $msg1 = << "EOF";
    こんにちは。
      さようなら。
EOF

my $msg2 = <<~ "EOF";
    こんにちは。
      さようなら。
    EOF

print $msg1;
print $msg2;

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

perl sample.pl

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

終端文字列のインデント(1)

インデントが設定されたヒアドキュメントを使用しない場合と使用した場合で結果が異なることが確認できます。

-- --

Perl のプログラムの中でヒアドキュメントを使って複数行の文字列を記述する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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