Что означает синтаксис в Perl?


Так я понимаю, что Perl имеет очень необычный синтаксис, но я наткнулся на фрагмент кода на работе в тот день, который оставил меня в замешательстве. Может кто-нибудь, пожалуйста, объясните мне, что это значит:

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

это похоже на синтаксис HEREDOC, но не в любой форме, которую я когда-либо видел.

2 82

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"