7
print <<EOF
stuff
EOF
;


print <<EOF;
stuff
EOF

なぜあなたは一方を他方よりも使用するのですか?

4

5 に答える 5

14

これら 2 つの例は動作的には同じですが、そのブロックを印刷した後に何か他のことをしたいかどうかを検討してください。

print <<EOF
stuff
EOF
. "more text here";

...または、操作の結果をテストする必要があるかもしれません:

print $unstable_filehandle <<EOF
stuff
EOF
or warn "That filehandle finally disappeared: $!";

これらの例は不自然ですが、テキスト ブロックの後に来るコードについて柔軟に対応できると便利な場合があることがわかります。

于 2010-10-25T16:12:06.600 に答える
9

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));
于 2010-10-25T19:29:00.373 に答える
4

ヒアドキュメントトークンは、文字列リテラルとまったく同じように扱う必要があります。内容が終わるまで、句読点や構文を遅らせないでください。これは誤解を招きやすく、エラーが発生しやすくなります。これがすべて実際のコードから取られた10の例です:

  1. ($is_a_valid_rfc_822_addr = <<'EOSCARY') =~ s/\n//g;
  2. $eval = (($Preamble=<<'END1') . $userstuff . <<'END2');
  3. for my $line (<<"End_of_Property_List" =~ m{ \S .* \S }gx) {
  4. $cases .= <<"EDQ" if $timeout;
  5. ($is_a_valid_rfc_822_addr = <<'EOSCARY') =~ s/\n//g;
  6. eval (($Preamble=<<'END1') . $_[0] . <<'END2');
  7. @changes = split("\n", <<"EOCHANGES");
  8. $change .= sprintf(<<"EOP", $in, $out, $in, $out);
  9. eval "{ package $package; " . <<'EOF' . "}";
  10. push @args, dequeue('|Q|', <<'END_OF_ASTRAL_MATCH') if $Opt{astral};

それがどのように機能するか見てみましょう。

于 2010-10-25T18:59:13.343 に答える
2

FWIW、Perl のベスト プラクティスでは次のことを推奨しています。

print <<'EOF';
stuff
EOF
于 2010-10-25T16:12:16.337 に答える
1

Randal Schwartzhereドキュメントに関する素晴らしい記事があります。

ヒアドキュメントについて覚えておくべきことがいくつかあります。

  1. in Perl はステートメント ターミネータであり、ヒアドキュメント文字列;を含むすべての Perl ステートメント (いくつかの例外を除く) に必要です。
  2. ヒアドキュメントは、実際にはただの大きな文字列である変な見た目のステートメントです。
  3. (他のほとんどの Perl ステートメントとは異なり)ヒアドキュメントには終了 CR が必要です。
  4. 開始タグの直後または終了タグの後に、任意の Perl コードを含めることができます。終了タグの後にある場合は、別の行にする必要があります。いずれの場合も、コードはヒア文字列のテキストを操作します。
  5. タグで使用する引用符は文字列に影響します。二重引用符は Perl の二重引用符文字列のようなもので、単一引用符は補間されず、逆引用符はシェルに渡されます。二重引用符に相当する引用符はありません。
  6. TIMTOWTDIですが、一部のフォームは読みにくいです。
  7. 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タグの最初のインスタンスまたはそれに続くコードの後に​​属します。終了タグの後ろだと読みにくいです。終了タグがステートメント修飾子または警告またはダイロジックに似た形式でない限り。それは私の個人的なスタイルガイドです。

于 2010-10-26T01:35:45.967 に答える