因此,我知道perl的语法很不正常,但是前一天在工作中遇到了一个代码片段,这让我感到困惑。有人可以向我解释这是什么意思:
<<'m'=~m>>
print $a unless $b;
return;
m
;
它看起来像HEREDOC语法,但没有任何我见过的形式。
因此,我知道perl的语法很不正常,但是前一天在工作中遇到了一个代码片段,这让我感到困惑。有人可以向我解释这是什么意思:
<<'m'=~m>>
print $a unless $b;
return;
m
;
它看起来像HEREDOC语法,但没有任何我见过的形式。
Answers:
这种秘密语法称为华丽的双刃剑,通常表示为:
<<m=~m>>
Comments here
m
;
这是一种用于多行注释的技巧,它使用Heredoc语法并将match运算符(=~
)与>
用作分隔符。
请注意,由于斜杠/
不能用作匹配的定界符,因此需要'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程序员,也是头疼的问题,毫无意义地难以阅读和维护!如果要创建适当的多行注释,那么我建议按照此处的说明使用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"