Итак, я понимаю, что у perl много необычного синтаксиса, но на днях я наткнулся на фрагмент кода на работе, который меня смутил. Может кто-нибудь объяснить мне, что это значит:
<<'m'=~m>>
print $a unless $b;
return;
m
;
Это похоже на синтаксис HEREDOC, но не в той форме, которую я когда-либо видел.
Ответы:
Этот секретный синтаксис известен как декоративный двуручный меч и обычно обозначается как:
<<m=~m>> Comments here m ;
Это хитрость для многострочных комментариев, использующая синтаксис heredoc и оператор сопоставления (
=~
) с>
разделителем as.Обратите внимание: косые черты,,
/
не используются в качестве разделителя для сопоставления, требуется оператор 'm'. Например$my_var =~ /test/
, эквивалентно$my_var =~ m>test>
, тогда как$my_var =~ >test>
будет недопустимым.Обратите внимание на то , что первый
m
символ в вашем фрагменте кода заключена в одинарные кавычки, то есть$a
и$b
переменные не будут интерполированное. Если бы эти кавычки были опущены (в соответствии с моим примером кода), Perl автоматически добавлял бы двойные кавычки к конечному маркеру, и все последующие переменные были бы интерполированы. Это вызовет проблемы, если$a
и$b
больше не определены, а вы используетеuse warnings;
.Чтобы упростить понимание вышеприведенного витиеватого примера с двумя лезвиями (но все же не рекомендуется), мы могли бы написать:
<<"END" =~ // Comments here END ;
Обратите внимание, что
=~ //
это избыточно, поэтому это эквивалентно:<<"END"; Comments here END
Это просто стандартный синтаксис heredoc в пустом контексте.
Я бы не рекомендовал использовать это в производственном коде, поскольку наличие строки в пустом контексте может вызвать проблемы. Кроме того, этот код является головной болью даже для самых опытных программистов на Perl, его бессмысленно трудно читать и поддерживать! Если вы хотите создать правильные многострочные комментарии, я бы посоветовал придерживаться модуля, как описано здесь. Как мне ввести многострочный комментарий в Perl?
Надеюсь, это проясняет ситуацию.
источник
Запуск B :: Deparse очень помогает понять, как Perl обрабатывает этот фрагмент кода (при условии, что он находится в файле "test.pl"):
показать нам:
"print \$a unless \$b;\nreturn;\n" =~ //; test.pl syntax OK
Итак, как видите, perl пытается сопоставить пустое регулярное выражение с этой строкой:
"print \$a unless \$b;\nreturn;\n"
источник