2004-01-22 21:29 更新
$msg = 'hello'; $str = <<EOF; メッセージは $msg です。 EOF
$msg = 'hello'; $str = <<"EOF"; メッセージは $msg です。 EOF
上のように書くと変数展開されて、「メッセージは hello です。」となる。
$msg = 'hello'; $str = <<'EOF'; メッセージは $msg です。 EOF
こう書けば変数展開は起こらず、「メッセージは $msg です。」となる。
ここからは追記内容です。
Perl では文字列を引用符で囲って表現します。引用符にはダブルコーテーション「"」、シングルコーテーション「'」、バッククート「`」があり、それぞれ意味が違います。
ヒアドキュメント (here document) とは、スクリプトの中で長い文字列を記述するために用いる記法です。コマンド<<引用マーカーの形式で始め、引用マーカーのみの行が来るまでの内容が文字列として与えられます。引用マーカーには任意の識別子が利用でき、例えば次のように書きます。
$msg = 'hello'; print <<HOGE; foo\n $msg bar HOGE
これは次のように出力されます。
foo hello bar
ヒアドキュメントでも引用マーカーをどの引用符で囲うかで文字列の解釈方法が違うようです。また、引用マーカーの引用符は省略する事が多く、ダブルコーテーションで囲った場合と同じ扱いになるようです。
Perl って便利だけれど複雑だね、と思いました。
if($foo){
print <<" EOF"
こういう風に、引用マーカーに空白を含めて
擬似インデントしても問題ないのか、少し気になります。
一応問題なく動作するように見えるのですが……
EOF
}
文字列が異常にインデントされますし、インデントの深さを間違えて自爆しそうなので実用で使った事はありませんが、こういう書き方も OK なのかちょっとだけ興味があります。
さらに文字列をトリミングする関数に渡してやるとインデントの過剰は解消されますが、自爆率が増しそうです。動作速度低下も間違いなし。
if(1){
$bar = 'hello';
print trim_left(4, <<" HOGE");
foo\n
$bar
moge
HOGE
}
sub trim_left {
my $depth = shift;
my $str = shift;
$str =~ s/^[ \t]{$depth}//gm;
return $str;
}
でも、無駄っぽくて楽しい。