2015-09-19 6 views
82

Also ich verstehe, dass Perl sehr ungewöhnliche Syntax hat, aber ich stieß auf ein Code-Schnipsel bei der Arbeit, die anderen Tag, die mich verwirrt hat. Könnte mir bitte jemand erklären, was es bedeutet:Was bedeutet die <<'m'=~m>> Syntax in Perl?

<<'m'=~m>> 
print $a unless $b; 
return; 
m 
; 

Es ist wie HEREDOC Syntax sieht, aber nicht in irgendeiner Form ich je gesehen habe.

+2

mögliche Duplikate von [Verständnis seltsamer Perl mehrzeiliger Kommentarmechanismus] (http: // stackoverflow com/questions/5443121/verstanding-strange-perl-multiline-comment-mechanism) – Gilles

+1

Sie können auf eine Liste der geheimen Perl Operatoren und Konstanten [hier] zugreifen (http: // search.cpan.org/dist/perlsecret/lib/perlsecret.pod). – aloisdg

Antwort

124

Diese geheime Syntax als ornate double-bladed sword bekannt und wird üblicherweise bezeichnet als:

<<m=~m>> 

Comments here 

m 
; 

Es ist ein Hack für mehrzeilige Kommentare, die Verwendung des heredoc Syntax und Match-Operator machen (=~) mit > als Trennzeichen.

Hinweis, da Schrägstriche / nicht als Trennzeichen für die Anpassung verwendet werden, ist der Operator 'm' erforderlich. Zum Beispiel ist $my_var =~ /test/ äquivalent zu $my_var =~ m>test>, wohingegen $my_var =~ >test> ungültig wäre.

Achten Sie darauf, dass das erste m Zeichen in Ihrem Snippet in einfache Anführungszeichen eingeschlossen ist, dh die Variablen $a und $b werden nicht interpoliert. Wären diese Anführungszeichen weggelassen worden (gemäß meinem mitgelieferten Codebeispiel), würde perl der Endmarke automatisch doppelte Anführungszeichen hinzufügen und alle nachfolgenden Variablen würden interpoliert werden. Dies würde Probleme verursachen, wenn $a und $b nicht länger definiert sind und Sie use warnings; verwenden.

<<"END" =~ // 

Comments here 

END 
; 

Beachten Sie, dass die =~ // redundant ist, so ist dies gleichbedeutend mit:

Um das verzierte Doppelblatt obige Beispiel leichter verständlich zu machen (aber immer noch empfohlen, nicht), könnten wir schreiben

<<"END"; 

Comments here 

END 

Das ist nur Standard-Heredoc-Syntax im void 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 ein Kopfzerbrechen für selbst die erfahrensten Perl-Programmierer und ist sinnlos schwer zu lesen und zu pflegen! Wenn Sie richtige mehrzeilige Kommentare erstellen möchten, würde ich vorschlagen, an Pod wie hier erläutert haften How do I enter a multi-line comment in Perl?

Hoffe das klärt es auf.

24

Lauf B::Deparse viel, um hilft zu verstehen, wie Perl das Stück Code ist der Umgang mit (vorausgesetzt, es bei "test.pl" Datei ist):

perl -MO=Deparse test.pl 

zeigen uns:

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

Also, wie Sie sehen können, versucht Perl, eine leere regexpr dieser Zeichenfolge zu entsprechen: "print \$a unless \$b;\nreturn;\n"