Что означает синтаксис в Perl?
Так я понимаю, что Perl имеет очень необычный синтаксис, но я наткнулся на фрагмент кода на работе в тот день, который оставил меня в замешательстве. Может кто-нибудь, пожалуйста, объясните мне, что это значит:
<<'m'=~m>>
print $a unless $b;
return;
m
;
это похоже на синтаксис HEREDOC, но не в любой форме, которую я когда-либо видел.
2 ответа:
этой секрет синтаксис известен как богато украшенный меч с двумя лезвиями, и обычно обозначается как:
<<m=~m>> Comments here m ;
это хак для многострочных комментариев, использование heredoc синтаксис и сопоставить оператор (
=~
) С>
в качестве разделителя.обратите внимание, как косые черты,
/
, не используются в качестве разделителя для сопоставления, требуется оператор '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 в контексте void.
я бы не рекомендовал использовать это в рабочий код как строку в Void контексте может вызвать проблемы. Плюс этот код является головная боль даже для самых опытные программисты perl и бессмысленно трудно читать и поддерживать! Если вы хотите создать правильные многострочные комментарии, я бы предложил придерживаться pod, как описано здесь как ввести многострочный комментарий в Perl?
надеюсь, это прояснит ситуацию.
под управлением B:: Deparse очень помогает понять, как perl обрабатывает этот кусок кода (предполагая, что он находится на "test.pl файл):
perl -MO=Deparse test.pl
показать нам:
"print $a unless $b;\nreturn;\n" =~ //; test.pl syntax OK
Итак, как вы можете видеть, perl пытается сопоставить пустое regexpr с этой строкой:
"print $a unless $b;\nreturn;\n"