●Perlのヒアドキュメントとはそもそも
妙な記述形式なので誤解されるが、ヒアドキュメントは引用方法の特殊形であり、EOSなどの文字列は一時的なカッコにすぎない。
つまり、print "This is a pen."; を
#---------------
prrint <<"EOS";
This is a pen.
EOS
#---------------
と表現したにすぎない。
○ 指定文字列(ここの例ではEOS)までの間をそのまま出力する。
○ EOS等の文字列は、直近までなのでファイル内で繰り返し使える。
○ "EOS"; のように" "で囲むと、内部の変数を展開して出力。' 'の場合は展開しない。
○ 展開したい変数と地の文字列が引っ付く場合は{ }で囲むと区別される。$name→${name}
#--------------------------------------------------
# ① ファイルに出力
print WR <<"EOS";
こんにちは
私は${name}です。
よろしく!
EOS
#--------------------------------------------------
# ② 標準出力で出力
print <<"EOS";
さしすせそ。
たちつてと。
EOS
#--------------------------------------------------
# ③ 通常変数(スカラ変数)に代入する。イコールを忘れずに!
# 追加は $hoge .= <<"EOS"; でOK
my $hoge = <<"EOS";
いろはにほへ。
ちりぬるを。
EOS
#--------------------------------------------------
●ヒアドキュメントで「Content-type: text/html」を出力する場合
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_kj03.htm
CGIでHTMLを出力する場合、最初に「Content-type: text/html」出力する。
このとき、html本体との間に区切りの「空行」が必要である。
このため通常は print "Content-type: text/html\n\n" と、改行2個を出力する。
ヒアドキュメントの場合は、必ず空行を入れる必要がある。
#---------------------------------------
print <<"EOS";
Content-type: text/html
(ここに空の1行必ず必要!)
<html>
<head>
......
</body>
</html>
EOS
#----------------------------------------
●ヒアドキュメント内に関数を埋め込む
http://perl-users.jp/articles/advent-calendar/2008/14.html
@{[ &hoge() ]} を使う
#-----------------------------------------
print <<"EOS";
<table>
<tr><td>
<p>コメント:@{[ &trim($comment,160,'...') ]} </p>
</td></tr>
</table>
EOS
#-----------------------------------------
●ヒアドキュメント出力時に入れ子になるJavaScriptのコード
Perlのヒアドキュメント中にJavaScriptのコードがあると、トラブルが生じる場合がある。
○変数の意図せざる展開
PerlもJavaScriptも変数は「$」で始まるため、ヒアドキュメント中でPerlが展開してしまう。
これを防ぐにはヒアドキュメントを、 print <<"EOS"; から print <<'EOS'; として
Perlが展開しないようにする。
○引用符
出力するhtml内にJavaScriptなどのコードがあり、その中で引用符がある場合は
入れ子になるので、「\\"」として二回エスケープする必要がある。
-------------------------------------------------------------
<script language="JavaScript">
<!--
function getstr() {
var newstr= "<b style=\\"color:#000000;\\">New!</b>";
//-->
</script>
-------------------------------------------------------------