print <<EOF
stuff
EOF
;
print <<EOF;
stuff
EOF
なぜあなたは一方を他方よりも使用するのですか?
これら 2 つの例は動作的には同じですが、そのブロックを印刷した後に何か他のことをしたいかどうかを検討してください。
print <<EOF
stuff
EOF
. "more text here";
...または、操作の結果をテストする必要があるかもしれません:
print $unstable_filehandle <<EOF
stuff
EOF
or warn "That filehandle finally disappeared: $!";
これらの例は不自然ですが、テキスト ブロックの後に来るコードについて柔軟に対応できると便利な場合があることがわかります。
tchrist が指摘しているように、ほとんどの人が無視していることの 1 つは、ヒアドキュメント オペレーターが終了コードの後に任意の Perl コードを取得することです。
これは、次のような (ほぼ間違いなく) より自然な操作を行うことができることを意味します。
my $obj = Foo::Bar->new(content => <<EOP)->do_stuff->sprint();
This is my content
It's from a heredoc.
EOP
1つの結果は、「スタックされていない」よりもはるかに読みやすく(私の意見では;)スタックできることです。
-- stacked_heredoc.pl
#!/usr/bin/perl
use strict;
use warnings;
print join(<<JOINER, split("\n", <<SOURCE));
------------------------------
JOINER
This is my text
this is my other text
a third line will get divided!
SOURCE
スタックされていないヒアドキュメントの詩...
-- unstacked_heredoc.pl
#!/usr/bin/perl
use strict;
use warnings;
my $joiner = <<JOINER
------------------------------
JOINER
;
my $source = <<SOURCE
This is my text
this is my other text
a third line will get divided!
SOURCE
;
print join($joiner, split("\n", $source));
ヒアドキュメントトークンは、文字列リテラルとまったく同じように扱う必要があります。内容が終わるまで、句読点や構文を遅らせないでください。これは誤解を招きやすく、エラーが発生しやすくなります。これがすべて実際のコードから取られた10の例です:
($is_a_valid_rfc_822_addr = <<'EOSCARY') =~ s/\n//g;
$eval = (($Preamble=<<'END1') . $userstuff . <<'END2');
for my $line (<<"End_of_Property_List" =~ m{ \S .* \S }gx) {
$cases .= <<"EDQ" if $timeout;
($is_a_valid_rfc_822_addr = <<'EOSCARY') =~ s/\n//g;
eval (($Preamble=<<'END1') . $_[0] . <<'END2');
@changes = split("\n", <<"EOCHANGES");
$change .= sprintf(<<"EOP", $in, $out, $in, $out);
eval "{ package $package; " . <<'EOF' . "}";
push @args, dequeue('|Q|', <<'END_OF_ASTRAL_MATCH') if $Opt{astral};
それがどのように機能するか見てみましょう。
FWIW、Perl のベスト プラクティスでは次のことを推奨しています。
print <<'EOF';
stuff
EOF
Randal Schwartzのhereドキュメントに関する素晴らしい記事があります。
ヒアドキュメントについて覚えておくべきことがいくつかあります。
;
を含むすべての Perl ステートメント (いくつかの例外を除く) に必要です。perldoc -q "HERE documents"
(およびperlfaq4 )からの引用:<< の後にスペースを入れてはいけません。
<<
[部分の]末尾に (おそらく) セミコロンがあるはずです。
タグの前に (簡単に) スペースを入れることはできません。
あなたが持っている2つのフォームは、機能的に同等です。{ ... } if (blah blah)
と同じですif (blah blah) { ... }
。これら 2 つのステートメントは機能的には同等ですが、「読み方」が異なります。
これらはそれぞれ同等で有効な Perl hereドキュメントです。
my %data = <<END
fred: Fred Flintstone
barney: Barney Rubble
betty: Betty Rubble
wilma: Wilma Flintstone
END
=~ /(\w+): (.*)/g;
と
my %data = <<END =~ /(\w+): (.*)/g;
fred: Fred Flintstone
barney: Barney Rubble
betty: Betty Rubble
wilma: Wilma Flintstone
END
# You must have a CR after the "END". Can't be EOF...
どちらも、フリントストーンの%data
ハッシュをに設定します。first=>"full name"
あなたに来るコードでどちらを見たいですか?
2 番目の形式には落とし穴があることに注意してください。終了マークの後にテキストまたは空白が必要ですCan't find string terminator "END" anywhere before EOF
。;
それが、一部の人々のhere docsで孤独を見る理由だと思います。
IMHO、here;
docタグの最初のインスタンスまたはそれに続くコードの後に属します。終了タグの後ろだと読みにくいです。終了タグがステートメント修飾子または警告またはダイロジックに似た形式でない限り。それは私の個人的なスタイルガイドです。