了解奇怪的Perl多行注释机制

时间:2011-03-26 14:59:36

标签: perl operators comments

编辑:注意新的Perl程序员:此机制不应用于多行注释!它有一个缺陷,降低了可读性。

在这PerlMonks post on mechanisms to produce multiline comments in Perl中,阿比盖尔提供了这个,让我感到困惑:

  

仅使用here文档的问题是它会在'-w'下发出警告。使用鲜为人知的<<<<<< >>操作

<<q=~q>>;
  This is a multiline comment.
q

通过-M0=Deparse运行它会产生:

"  This is a multiline comment.\n" =~ //;
-e syntax OK

有人可以告诉我发生了什么事吗?

3 个答案:

答案 0 :(得分:15)

阿比盖尔的回答部分是幽默的。实际上没有<< >>运算符(不是在Perl before 5.22的版本中),但有一个(不是那个众所周知的,我猜)<<运算符。不是二元移位运算符,而是一元here-document (heredoc for short)。一个简单的形式是:

$long_string = <<EOF;
This is a long, multiline string.
It ends when EOF appears alone on a line.
It will be assigned to the \$long_string variable.
EOF
事实上,这是阿比盖尔答案背后的“多线评论”特征 - 多线字符串文字。剩下的就是有点模糊的Perl。

<<之后的单词或带引号的字符串结束字符串文字。您可以将q用作赤字:

<<q;
This is a multiline comment, or rather a string literal whose value is ignored.
q

要理解Abigail的其余片段,将here-document重写为简单的字符串文字会有所帮助:

"This is a multiline comment.\n" =~ q>>;

好的,现在q>>q quote-like operator,其中>是分隔符。 q>>相当于''(非插值文字,恰好是空的)。所以字符串文字是matched against an empty pattern。无论如何,此匹配的结果都会被忽略,但这会破坏匹配结果变量($1$&等)。

答案 1 :(得分:11)

哈。没有“&lt;&lt;&gt;&gt;”这样的东西运营商。那里发生的事情基本上与此相同:

"" =~ ''

=~当然是您通常与m//s///一起使用的普通模式绑定运算符。 ''对文字字符串使用q {}语法,>作为分隔符,并在运行时被解释为模式。 ""是here-doc,q作为终止字符串。

我当然不会称之为评论。考虑一下这个程序片段的输出:

"copacetic" =~ q/(c[a-z]+)/;
print "$1\n";

<<q=~q>>;
    This is crap, not a comment!
q

print "$1\n";

答案 2 :(得分:5)

以下内容不是很好,但它不会导致可执行代码。

0 && <<COMMENT
...
COMMENT