Ich verstehe also, dass Perl eine sehr ungewöhnliche Syntax hat, aber ich bin neulich bei der Arbeit auf ein Code-Snippet gestoßen, das mich verwirrt hat. Könnte mir bitte jemand erklären, was es bedeutet:
<<'m'=~m>>
print $a unless $b;
return;
m
;
Es sieht aus wie HEREDOC-Syntax, aber in keiner Form, die ich jemals gesehen habe.
Antworten:
Diese geheime Syntax ist als reich verziertes Doppelklingenschwert bekannt und wird typischerweise bezeichnet als:
Es ist ein Hack für mehrzeilige Kommentare, bei dem die Heredoc- Syntax und der Match-Operator (
=~
) mit verwendet werden>
als Trennzeichen verwendet werden.Beachten Sie, dass Schrägstriche
/
nicht als Trennzeichen für den Abgleich verwendet werden. Der Operator 'm' ist erforderlich. Zum Beispiel$my_var =~ /test/
ist äquivalent zu$my_var =~ m>test>
, während$my_var =~ >test>
ungültig wäre.Achten Sie auf die Tatsache , dass das erste
m
Zeichen in Ihrem Schnipsel durch einfache Anführungszeichen eingeschlossen ist, was bedeutet , die$a
und$b
Variablen werden nicht interpoliert werden. Wären diese Anführungszeichen weggelassen worden (gemäß meinem bereitgestellten Codebeispiel), würde Perl dem Endmarker automatisch doppelte Anführungszeichen hinzufügen und alle nachfolgenden Variablen würden interpoliert. Dies würde Probleme verursachen, wenn$a
und$b
nicht mehr definiert sind und Sie verwendenuse warnings;
.Um das obige Beispiel mit verzierten Doppelklingen verständlicher zu machen (aber immer noch nicht empfohlen), könnten wir schreiben:
Beachten Sie, dass das
=~ //
redundant ist. Dies entspricht also:Dies ist nur die Standard-Heredoc-Syntax im ungültigen Kontext.
Ich würde nicht empfehlen, dies im Produktionscode zu verwenden, da eine Zeichenfolge im ungültigen Kontext Probleme verursachen kann. Außerdem ist dieser Code selbst für die erfahrensten Perl-Programmierer ein Kratzer und sinnlos schwer zu lesen und zu warten! Wenn Sie richtige mehrzeilige Kommentare erstellen möchten, würde ich empfehlen, wie hier erläutert am Pod festzuhalten Wie gebe ich einen mehrzeiligen Kommentar in Perl ein?
Hoffe das klärt es auf.
quelle
Das Ausführen von B :: Deparse hilft sehr, um zu verstehen, wie Perl mit diesem Code umgeht (vorausgesetzt, er befindet sich in der Datei "test.pl"):
Zeig uns:
Wie Sie sehen können, versucht Perl, dieser Zeichenfolge einen leeren regulären Ausdruck zuzuordnen:
"print \$a unless \$b;\nreturn;\n"
quelle