2004年01月22日

カテゴリ
perl

perl のヒアドキュメント

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 での文字列の扱い

Perl では文字列を引用符で囲って表現します。引用符にはダブルコーテーション「"」、シングルコーテーション「'」、バッククート「`」があり、それぞれ意味が違います。

"文字列"
変数は値に展開されます。また、 \t (タブ) や \n (改行) などのメタ文字も解釈されます。演算子を使って qq/文字列/ と書くこともできます。
'文字列'
変数は展開されませんし、メタ文字も使えません。ただし、' は \' に、\ は \\ とエスケープする必要があります。演算子を使って q/文字列/ と書くこともできます。
`文字列`
変数は値に展開され、その値をコマンドとして実行します。そのコマンドの結果が文字列として返されます。qx/文字列/ と書くこともできます。

ヒアドキュメント

ヒアドキュメント (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;
 }

でも、無駄っぽくて楽しい。

投稿者
nero
投稿日
2004年01月22日 10:41

コメント

コメントの投稿

入力した情報を記憶させますか?