Що означає синтаксис << 'm' = ~ m >> у perl?


82

Отже, я розумію, що perl має набагато незвичний синтаксис, але того дня на роботі я натрапив на фрагмент коду, який мене збентежив. Хтось може пояснити мені, що це означає:

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

Це схоже на синтаксис HEREDOC, але не в тій формі, яку я коли-небудь бачив.



1
Ви можете отримати доступ до списку секретних операторів та констант Perl тут .
aloisdg переїжджає на codidact.com

Відповіді:


124

Цей таємний синтаксис відомий як багато прикрашений двоострий меч і зазвичай позначається як:

<<m=~m>>

Comments here

m
;

Це хак для багаторядкових коментарів, використовуючи синтаксис heredoc та оператор match ( =~) з >як роздільник.

Зверніть увагу, що скісні риски, /не використовуються як роздільник для узгодження, потрібен оператор 'm'. Наприклад $my_var =~ /test/, еквівалентно $my_var =~ m>test>, тоді як $my_var =~ >test>буде недійсним.

Зверніть увагу на те, що перший mсимвол у вашому фрагменті укладений одинарними лапками, тобто змінні $aand $bі не будуть інтерпольовані. Якби ці лапки були опущені (згідно з наведеним моїм прикладом коду), perl автоматично додав би подвійні лапки до кінцевого маркера, а всі наступні змінні були б інтерпольовані. Це може привести до проблем , якщо $aі $bне більше і не визначена , і ви використовуєте use warnings;.

Щоб полегшити розуміння багато прикрашеного прикладу з двома лезами (але все ж не рекомендується), ми могли б написати:

<<"END" =~ //

Comments here

END
;

Зверніть увагу, що =~ //є зайвим, тому це еквівалентно:

<<"END";

Comments here

END

Що є лише стандартним гередоковим синтаксисом у порожньому контексті.

Я б не рекомендував використовувати це у виробничому коді, оскільки наявність рядка у контексті void може спричинити проблеми. Крім того, цей код є головним скриптом навіть для найдосвідченіших програмістів perl, і його безглуздо важко читати та обслуговувати! Якщо ви хочете створити належні багаторядкові коментарі, тоді я б запропонував дотримуватися pod, як пояснено тут. Як мені ввести багаторядковий коментар у Perl?

Сподіваюся, це прояснить.


24

Запуск B :: Deparse дуже допомагає, щоб зрозуміти, як Perl обробляє цей фрагмент коду (припускаючи, що він знаходиться у файлі "test.pl"):

perl -MO=Deparse  test.pl 

Покажи нам:

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

Отже, як бачите, perl намагається зіставити порожній регулярний вираз із цим рядком: "print \$a unless \$b;\nreturn;\n"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.