Co oznacza składnia << 'm' = ~ m >> w perlu?

82

Rozumiem więc, że perl ma bardzo nietypową składnię, ale tamtego dnia natknąłem się na fragment kodu, który wprawił mnie w zakłopotanie. Czy ktoś mógłby mi wyjaśnić, co to znaczy:

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

Wygląda jak składnia HEREDOC, ale nie w żadnej formie, jaką kiedykolwiek widziałem.

AliceHemp
źródło
2
możliwy duplikat Zrozumieć dziwny mechanizm wielowierszowych komentarzy Perla
Gilles'a - przestań być zły.
1
Możesz uzyskać dostęp do listy tajnych operatorów Perla i stałych tutaj .
aloisdg przenosi się do codidact.com

Odpowiedzi:

124

Ta sekretna składnia jest znana jako ozdobny miecz o podwójnym ostrzu i jest zwykle oznaczana jako:

<<m=~m>>

Comments here

m
;

Jest to trik dla komentarzy wielowierszowych, wykorzystujący składnię heredoc i operator dopasowania ( =~) z >ogranicznikiem.

Pamiętaj, że ukośniki /nie są używane jako separator przy dopasowywaniu, wymagany jest operator „m”. Na przykład $my_var =~ /test/jest równoważne $my_var =~ m>test>, podczas gdy $my_var =~ >test>byłoby nieprawidłowe.

Należy zwrócić uwagę na fakt, że pierwszy mznak w swoim fragmencie jest otoczony apostrofami, co oznacza, że $ai $bzmienne nie będzie interpolowana. Gdyby te cudzysłowy zostały pominięte (zgodnie z podanym przeze mnie przykładem kodu), perl automatycznie dodawałby podwójne cudzysłowy do znacznika końcowego, a wszelkie kolejne zmienne byłyby interpolowane. Spowodowałoby to problemy, jeśli $ai $bnie są już zdefiniowane i używasz use warnings;.

Aby powyższy przykład ozdobnego podwójnego ostrza był łatwiejszy do zrozumienia (ale nadal nie jest to zalecane), możemy napisać:

<<"END" =~ //

Comments here

END
;

Zauważ, że =~ //jest nadmiarowy, więc jest to równoważne z:

<<"END";

Comments here

END

Co jest po prostu standardową składnią heredoc w kontekście pustki.

Nie polecałbym używania tego w kodzie produkcyjnym, ponieważ posiadanie łańcucha w kontekście pustym może powodować problemy. Poza tym ten kod jest drapieżnikiem nawet dla najbardziej doświadczonych programistów Perla i jest bezcelowo trudny do odczytania i utrzymania! Jeśli chcesz tworzyć poprawne komentarze wieloliniowe, sugerowałbym trzymanie się pod, jak wyjaśniono tutaj. Jak wprowadzić komentarz wieloliniowy w Perlu?

Mam nadzieję, że to wyjaśnia sprawę.

Hayden
źródło
24

Uruchomienie B :: Deparse bardzo pomaga w zrozumieniu, jak perl radzi sobie z tym fragmentem kodu (zakładając, że znajduje się on w pliku „test.pl”):

perl -MO=Deparse  test.pl 

Pokaż nam:

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

Jak więc widać, perl próbuje dopasować puste wyrażenie regularne do tego ciągu: "print \$a unless \$b;\nreturn;\n"

Miguel Prz
źródło