ヒアドキュメントは便利だなというお話

たまによくあること

プログラムやスクリプトを書いているとき、改行を気にせず文字列を書きたい!ということがあります。
あります、、ありますよね、、、?
可視性や可読性のためという場合もあるし、処理や記述自体が簡潔にできるパターンもあります。
そのようなときに役立つのがヒアドキュメント。
というわけで、今回はそんなヒアドキュメントの例をご紹介します。

そもそもヒアドキュメントって?

コードを書く人であればご存知かとは思いますが、プログラムやスクリプトの中に文字列を埋め込む方法です。
例えば、Perlで次のようなプログラムを書いたとします。

print "This is a pen.";
print "This pen is mine.";

実行するとこうなります。

This is a pen.This pen is mine.

この場合、改行されません。改行するには以下の書き方が必要です。

print "This is a pen.\n";
print "This pen is mine.\n";

これで実行すれば無事改行されますね。

This is a pen.
This pen is mine.

当然ではあるのですが、改行コード等で読みづらい。
というわけでヒアドキュメントの出番です。
ヒアドキュメントは、<<"EOS"; と EOS で囲まれた文字列で、該当箇所が固定の文字列として扱われます(EOSは任意の文字列へ変更可能です)。
Perlの例では、次のようになります。

my $text = <<"EOS";
This is a pen.
This pen is mine.
EOS

print $text;

すっきりとして読みやすくなりましたね。
実行するとこうなります。

This is a pen.
This pen is mine.

予想通り出力されました。
なお、最初のEOSを括るのがダブルクォーテーション(")の場合はヒアドキュメント内で変数展開され、シングルクォーテーション(')の場合はされません。

応用例

とはいえ、これだけではあまりありがたみを感じられないですよね。
というわけで、利用例をいくつかご紹介します。

例① プログラムから設定ファイルを出力する

シンプルなケースですが、自動化等でひな形とパラメータを元に設定ファイルを出力したいようなケースです。
もちろんヒアドキュメントを使う必要はないですが、可読性を損なわずにプログラム1つで書ける、、かもしれません(作りによってはひな形外だしにした方がいいかもですが)。
Perlでの例ですが、Apacheのバーチャルホスト設定を出力しようとしています。

my $CONF = $domain.".conf";
my $VHOSTTEMPLATE = <<'EOS';
<VirtualHost ###IPADDR###:80>
    ServerName "###DOMAIN###:80"
    ServerAlias "www.###DOMAIN###"

    DocumentRoot "/var/www/vhosts/###DOMAIN###/httpdocs"
    <Directory /var/www/vhosts/###DOMAIN###/httpdocs>
        Options +Includes +ExecCGI
    </Directory>
</VirtualHost>
EOS

$VHOSTTEMPLATE =~ s/###DOMAIN###/$domain/g;
$VHOSTTEMPLATE =~ s/###IPADDR###/$ipaddr/g;

open FILE, "> $CONF";
print FILE $VHOSTTEMPLATE;
close FILE;

エラー処理もしていないし入力部分がない抜粋だしバーチャルホスト設定は手抜きですが、雰囲気は伝わるかと思います(伝わってほしい!)。
これなら読みやすいし、何かあったときの修正も悩まずできそうですよね!

例② シェルスクリプトからSSHで他サーバーへ接続して処理を行う

SSHで他サーバーへ接続可能な場合、接続先へリモートログインするだけではなく、ログインはせずにコマンド実行することが可能です。
例えば、

$ ssh user@test.example.com ls -l

のようなコマンドを実行すると、接続先サーバーtest.example.comのuserユーザのホームディレクトリでls -lコマンドを実行した結果が表示されます。
このシンプルな例では問題ないですが、ではちょっとややこしいケースではどうなるでしょうか。
例えば、サーバーとドメインのリストを元にして、各サーバーでコマンド実行したい、、というケースがあったとします。
その際に、コマンドの引数がややこしくてエスケープとか考えると非常に煩雑になる場合、ヒアドキュメントを利用すると簡潔に書くことができます。

ssh user@${server} bash -s <<EOS
/usr/local/bin/command_example --add ${domain} -set "test text +1 example -sample"
EOS

その場合、コマンド例はこれまた超適当ですが、、、雰囲気は伝わる、、かな、、
これまた可読性を損なわず、エスケープ地獄に悩まされずに書けることが分かるかと思います。
※たまーに必要に迫られてこういう処理を書くと、ヒアドキュメントなしでは結構悩まされることがあります

というわけで

ヒアドキュメントは地味だけど結構便利ですよ、というお話でした。
余裕があればまた別の機会に少し掘り下げてみようかと思いますが、とりあえず今回はこの辺で。
それではまた!