Diese beiden Beispiele verhalten sich ähnlich, aber bedenken Sie, ob Sie nach dem Drucken dieses Blocks noch etwas anderes machen wollten:
%Vor%... oder vielleicht müssen Sie das Ergebnis der Operation testen:
%Vor%Diese Beispiele sind erfunden, aber Sie können sehen, wie es manchmal nützlich sein kann, flexibel zu sein, welcher Code nach dem Textblock kommt.
Wie tchrist hervorhebt, vernachlässigen die meisten Leute, dass der heredoc-Operator beliebigen Perl-Code nach dem Beendigungscode verwendet.
Dies bedeutet, dass Sie eine (natürlich) natürlichere Manipulation durchführen können, wie zum Beispiel:
%Vor%Eine Konsequenz ist, dass Sie sie VIEL besser lesbar (meiner Meinung nach) als "unstacked" stapeln können:
%Vor%versieht einen unstaped heredoc ...
%Vor%Sie sollten heredoc-Token genau wie die String-Literale behandeln, die sie sind. Verzögern Sie nicht weitere Interpunktion oder Syntax bis nach ihrem Inhalt. Das ist irreführend und fehleranfällig. Hier sind zehn Beispiele aus dem echten Code:
($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};
Sehen Sie, wie das funktioniert?
Randal Schwartz hat einen tollen Artikel über die folgenden Dokumente: HIER .
Es gibt einige Dinge, an die Sie sich in diesem Dokument erinnern sollten:
;
in Perl ist das Statement-Terminator und wird für alle Perl-Anweisungen benötigt (mit einigen Ausnahmen), einschließlich hier Dokumente Strings; Zitieren von perldoc -q "HERE documents"
(und perlfaq4 ):
Nach dem & lt; & lt; Teil.
Dort sollte (wahrscheinlich) ein Semikolon am Ende [von <<
part] stehen.
Sie können (einfach) keinen Platz vor dem Tag haben.
Die zwei Formen, die Sie haben, sind funktionell gleichwertig. Genauso wie { ... } if (blah blah)
dasselbe ist wie if (blah blah) { ... }
. Während diese beiden Aussagen funktional gleichwertig sind, "lesen" sie anders.
Jede davon ist äquivalent und gültige Perl-Dokumente hier:
%Vor%und
%Vor% Beide setzen den %data
Hash auf first=>"full name"
für die Flintstones. Was würdest du lieber im Code sehen, der zu dir kommt?
Beachten Sie, dass die zweite Form eine ist, bei der es ein Problem gibt: Nach der Endmarke muss Text oder Leerzeichen sein oder Sie erhalten Can't find string terminator "END" anywhere before EOF
Ich denke, das ist der Grund, warum Sie die einzige ;
in einigen Dokumenten sehen .
IMHO, die ;
gehört nach der ersten Instanz des hier Doc-Tags oder dem Code, der darauf folgt. Es ist schwieriger zu lesen, wenn es nach dem schließenden Tag ist. Sofern das schließende Tag in einer Form ist, die einem Anweisungsmodifikator oder einer Warn- oder Die-Logik ähnelt. Das ist nur mein persönlicher Style Guide.