EatSmartシステム部ブログ

ウェブサイトの開発や運営に関する情報です。

ヒアドキュメントについて

プログラム内に別のプログラムや長いテキストを埋め込む際に、文字列の結合やエスケープなど面倒な処理が必要となることが多いと思いますが、ヒアドキュメントを使うと楽になることを知りました。

と言いつつも、メインで使っているJavaでは13以降の機能のようですが…。

bash

ヒアドキュメントと言えばシェルが定番のようですが、シェルで<< labellabelで囲んだ範囲が、そのまま標準出力として渡るようです。 つまり、

$ cat << EOS
> Here
> document
> test
> EOS
Here
document
test

という感じです。 catコマンドに渡した<< EOSからEOSの間の文字列が、改行も含めそのまま渡されて表示されています。

psql

シェルのヒアドキュメントを使うとpsqlSQLを実行したい時も、改行や整形をしながらシェルに記述できます。 例えば、

$ 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>

こうなります。

f:id:eatsmart:20200828141217p:plain

PostgreSQL(PL/pgSQL)

ヒアドキュメントと少し違いますが、PostgreSQLではドル記号を使うことで、文字列をシングルクォート以外のもので指定することができます。 文字列の中で引用符(シングルクォート)を使う時にエスケープするのが大変なことがあるので、とても便利な機能だと思います。

www.postgresql.jp

PostgreSQLSQL構文では、引用符で囲まれている範囲はヒアドキュメント的になっているので、以下のように使うことができます。

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

みたいにするのが便利ですよ。