Что означает синтаксис << '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 и оператор сопоставления ( =~) с >разделителем 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?

Надеюсь, это проясняет ситуацию.


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.