ヒアドキュメントについて
プログラム内に別のプログラムや長いテキストを埋め込む際に、文字列の結合やエスケープなど面倒な処理が必要となることが多いと思いますが、ヒアドキュメントを使うと楽になることを知りました。
と言いつつも、メインで使っているJavaでは13以降の機能のようですが…。
bash
ヒアドキュメントと言えばシェルが定番のようですが、シェルで<< label
とlabel
で囲んだ範囲が、そのまま標準出力として渡るようです。
つまり、
$ cat << EOS > Here > document > test > EOS Here document test
という感じです。
catコマンドに渡した<< EOS
からEOS
の間の文字列が、改行も含めそのまま渡されて表示されています。
psql
シェルのヒアドキュメントを使うとpsqlでSQLを実行したい時も、改行や整形をしながらシェルに記述できます。 例えば、
$ psql -U user -d database << SQL > SELECT > NOW() > ; > SQL now ------------------------------- 2020-08-28 14:14:09.013502+09 (1 row)
となるので、SQLを実行するシェルを作る場合も、psqlに対してヒアドキュメントで整形したSQLを記述することができます。
JavaScript
ES6のJavaScriptでは、テンプレート文字列という機能を使ってヒアドキュメントを実現します。 やり方としては、文字列をバッククォートで囲むだけでOKです。
こう書けば
<script> console.log(` Here document test `); </script>
こうなります。
PostgreSQL(PL/pgSQL)
ヒアドキュメントと少し違いますが、PostgreSQLではドル記号を使うことで、文字列をシングルクォート以外のもので指定することができます。 文字列の中で引用符(シングルクォート)を使う時にエスケープするのが大変なことがあるので、とても便利な機能だと思います。
PostgreSQLのSQL構文では、引用符で囲まれている範囲はヒアドキュメント的になっているので、以下のように使うことができます。
$ psql -U user -d database Type "help" for help. database=> select $$ database$> Here database$> document database$> test database$> 'Here document test' database$> $$ database-> ; ?column? ---------------------- + Here + document + test + 'Here document test'+ (1 row)
PL/pgSQLで関数定義する時も
CREATE OR REPLACE FUNCTION xxxxxxxxxxxx() RETURNS xxxxxx AS $$ DECLARE … BEGIN … END; $$ LANGUAGE plpgsql;
としたり、ただブロック実行する時も
DO $$ DECLARE C_NOW TIMESTAMP := CURRENT_TIMESTAMP; P_TIMESTAMP TIMESTAMP; BEGIN SELECT C_NOW INTO P_TIMESTAMP; RAISE NOTICE '今は%',P_TIMESTAMP; END $$;
みたいにするのが便利ですよ。