【问题标题】:Understanding strange Perl multiline comment mechanism理解奇怪的 Perl 多行注释机制
【发布时间】:2011-07-23 12:32:05
【问题描述】:

编辑:Perl 新程序员注意:这种机制不应该用于多行 cmets!它有一个缺陷会降低可读性。

在这个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

谁能告诉我这是怎么回事?

【问题讨论】:

  • 哇,我觉得很害羞!答案正盯着我的脸。魔术师让你看左手 (&lt;&lt;),然后是右手 (&gt;&gt;),愚弄你。

标签: perl operators comments


【解决方案1】:

阿比盖尔的回答有些幽默。实际上没有&lt;&lt; &gt;&gt; 运算符(在Perl 版本中没有before 5.22),但有一个(我猜不是那么知名)&lt;&lt; 运算符。不是二元移位运算符,而是一元 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

事实上,这是 Abigail 答案背后的“多行注释”功能——多行字符串文字。剩下的就是有点模糊的 Perl。

&lt;&lt; 之后的裸字或带引号的字符串结束了字符串文字。您可以使用q 作为裸词:

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

为了理解 Abigail 的 sn-p 的其余部分,将 here-document 重写为简单的字符串文字会有所帮助:

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

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

【讨论】:

  • 妈的,比我快 47 秒。那只是因为我正在测试我的程序片段以确保我没有拼写错误。无论如何,我会给你+1,尽管我很痛苦。 ;)
  • 当然我知道heredoc &lt;&lt;,我简直不敢相信我没有看到隐藏在q&gt;&gt; 中的q{}!哇,我觉得很害羞。正如我所怀疑的那样,整件事让我想起了我在其他地方看到的--&gt; 运算符perl -E '$x=5;say $x while ($x --&gt; 0);'
  • 我应该说q 运算符不是正则表达式引号运算符 (qr),而是非插值引号运算符
  • 我最近一直在调用&lt;&lt; 运算符hasta 运算符,如&lt;&lt;"La_Vista"
  • 有一个从 Perl 5.22 开始的 &lt;&lt; &gt;&gt; 运算符。
【解决方案2】:

哈。没有“>”运算符之类的东西。那里发生的事情基本上相当于这样:

"" =~ ''

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

不过,我当然不会将此称为评论。考虑这个程序片段的输出:

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

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

print "$1\n";

【讨论】:

  • 查看我的 Deparse 结果后,我想知道这是否不会发生。我投票给你,其他人也应该投票!太糟糕了,只有一个正确的。谢谢!
【解决方案3】:

以下内容不那么漂亮,但它导致没有可执行代码。

0 && <<COMMENT
...
COMMENT

【讨论】:

  • 在 tchrist 的脉络中,更好的似乎是将 pod 格式作为评论命令 =for commentperlperldoc(以及其他 pod 读者)忽略。然而,这不是我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
相关资源
最近更新 更多