Next: Parentheses, Previous: Interpolation I, Up: Perl [Contents][Index]
Perlは他のプログラム言語のソースや、任意のファイルフォーマットを生成するために使用されることもあります。このような使用方法の例として有名なものには、HTMLコードを出力するWebアプリケーションがあります。
以下のHTMLの例のように、翻訳可能なメッセージを含む言語(またはプログラム言語)を、散在させて記述したい状況に出会うこともあるでしょう:
print gettext <<EOF; <h1>My Homepage</h1> <script language="JavaScript"><!-- for (i = 0; i < 100; ++i) { alert ("Thank you so much for visiting my homepage!"); } //--></script> EOF
parserによりヒアドキュメント全体が抽出されて、埋め込みJavaScriptの断片が含まれたHTMLコードが、抽出結果であるPOファイルに出現します。上記のような構築法の多用には、そのパッケージの翻訳者がもっと難易度の低いパッケージを探すというリスクがあります。このような場合には以下のような代替の表現を考慮する必要があるでしょう:
print <<EOF; <h1>$gettext{"My Homepage"}</h1> <script language="JavaScript"><!-- for (i = 0; i < 100; ++i) { alert ("$gettext{'Thank you so much for visiting my homepage!'}"); } //--></script> EOF
この例ではコードの翻訳可能な部分だけが抽出されるので、結果となるPOファイルは、不本意ながら可読性の点においては改善されるでしょう。
すべての文字列の中のhashのルックアップ、およびquote風な表現は補間することができます(quote風というな表現は、補完という処理が抱えているテーマでもあります。詳細についてはmanpage ‘man perlop’を参照してください)。しかし2重の補間は無効になります:
# TRANSLATORS: Replace "the earth" with the name of your planet. print gettext qq{Welcome to $gettext->{"the earth"}};
最初の位置のqq
によりクォートされた文字列が、xgettext
の引数として認識されて、無効な可変補間かどうかをチェックされますそのため、hash-dereferencingの$記号は、parserによって“invalid
interpolation”エラーとなります。
以下の、正規表現の中のhash lookupの補間は有効です:
if ($var =~ /$gettext{"the earth"}/) { print gettext "Match!\n"; } s/$gettext{"U. S. A."}/$gettext{"U. S. A."} $gettext{"(dial +0)"}/g;