Was bedeutet die Syntax << 'm' = ~ m >> in Perl?

82

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.

AliceHemp
quelle
2
Mögliches Duplikat des Verständnisses des seltsamen mehrzeiligen Perl-Kommentarmechanismus
Gilles 'SO - hör auf, böse zu sein'
1
Sie können eine Liste von Perl geheimen Operatoren und Konstanten zugreifen hier .
Aloisdg wechselt zu codidact.com

Antworten:

124

Diese geheime Syntax ist als reich verziertes Doppelklingenschwert bekannt und wird typischerweise bezeichnet als:

<<m=~m>>

Comments here

m
;

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 mZeichen in Ihrem Schnipsel durch einfache Anführungszeichen eingeschlossen ist, was bedeutet , die $aund $bVariablen 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 $aund $bnicht mehr definiert sind und Sie verwenden use warnings;.

Um das obige Beispiel mit verzierten Doppelklingen verständlicher zu machen (aber immer noch nicht empfohlen), könnten wir schreiben:

<<"END" =~ //

Comments here

END
;

Beachten Sie, dass das =~ //redundant ist. Dies entspricht also:

<<"END";

Comments here

END

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.

Hayden
quelle
24

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"):

perl -MO=Deparse  test.pl 

Zeig uns:

"print \$a unless \$b;\nreturn;\n" =~ //;
test.pl syntax OK

Wie Sie sehen können, versucht Perl, dieser Zeichenfolge einen leeren regulären Ausdruck zuzuordnen: "print \$a unless \$b;\nreturn;\n"

Miguel Prz
quelle