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.
Odpowiedzi:
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
m
znak w swoim fragmencie jest otoczony apostrofami, co oznacza, że$a
i$b
zmienne 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$a
i$b
nie są już zdefiniowane i używaszuse 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ę.
źródło
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”):
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"
źródło