Was ist der Unterschied zwischen diesen beiden Perl-Snippets?

7
%Vor%

Warum würdest du eins über dem anderen benutzen?

    
user318747 25.10.2010, 15:14
quelle

5 Antworten

14

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.

    
Ether 25.10.2010, 16:12
quelle
9

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%     
Sir Robert 25.10.2010 19:29
quelle
4

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:

  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};

Sehen Sie, wie das funktioniert?

    
tchrist 25.10.2010 18:59
quelle
2

FWIW, Perl Best Practices empfiehlt:

%Vor%     
geoffspear 25.10.2010 16:12
quelle
1

Randal Schwartz hat einen tollen Artikel über die folgenden Dokumente: HIER .

Es gibt einige Dinge, an die Sie sich in diesem Dokument erinnern sollten:

  1. Das ; in Perl ist das Statement-Terminator und wird für alle Perl-Anweisungen benötigt (mit einigen Ausnahmen), einschließlich hier Dokumente Strings;
  2. Das hier vorliegende Dokument ist eine witzig aussehende Aussage, die wirklich nur eine große Zeichenfolge ist;
  3. Es muss eine abschließende CR für ein Here-Dokument geben (im Gegensatz zu den meisten anderen Perl-Anweisungen);
  4. Sie können beliebigen Perl-Code entweder unmittelbar nach dem öffnenden Tag oder nach dem schließenden Tag haben. Wenn nach dem schließenden Tag, muss es in einer separaten Zeile sein. In beiden Fällen arbeitet der Code mit dem Text der hier angegebenen Zeichenfolge;
  5. Die Anführungszeichen, die Sie für die Tags verwenden, wirken sich auf die Zeichenfolge aus. Doppelte Anführungszeichen sind wie doppelte Anführungszeichenfolgen in Perl, einfache Anführungszeichen interpolieren nicht, negative Anführungszeichen werden an die Shell übergeben. Keine Anführungszeichen sind doppelten Anführungszeichen gleich;
  6. TIMTOWTDI, aber einige sind schwer zu lesen;
  7. 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.

    
dawg 26.10.2010 01:35
quelle

Tags und Links