Perl "reverse comma operator"(来自《Programming Perl》一书的示例,第 4 版)

标签 perl operators comma scalar-context

我正在阅读“Programming Perl ”并遇到一个似乎没有意义的奇怪例子。这本书描述了 Perl 中的逗号运算符如何在标量上下文中使用时仅返回最后一个结果。

示例:

# After this statement, $stuff = "three"
$stuff = ("one", "two", "three");

然后,这本书在几页之后给出了这个“反向逗号运算符”的例子(第 82 页)
# A "reverse comma operator".
return (pop(@foo), pop(@foo))[0];

然而对我来说,这似乎根本不是相反的......?

示例:
# After this statement, $stuff = "three"
$stuff = reverse_comma("one", "two", "three");

# Implementation of the "reverse comma operator"
sub reverse_comma {
    return (pop(@_), pop(@_))[0];
}

这与正常的逗号运算符有什么不同?结果是一样的,没有反转!

这是一个 link到确切的页面。该示例靠近底部。

最佳答案

这是一个不好的例子,应该被遗忘。

它展示的内容很简单:

  • 通常,如果您在标量上下文中有一个由逗号分隔的表达式序列,则可以将其解释为逗号运算符的一个实例,它的计算结果为序列中的最后一个内容。
  • 但是,如果您将该序列放在括号中并粘贴 [0]最后,它将该序列转换为一个列表并获取其第一个元素,例如
    my $x = (1, 2, 3)[0];
    

    出于某种原因,本书将其称为“反向逗号运算符”。这是用词不当。它只是一个列表,它的第一个元素被采用。

  • 这本书使用 pop 进一步混淆了问题。在参数中运行两次。这些是从左到右计算的,所以第一个 pop计算结果为 "three"第二个到 "two" .

    在任何情况下:永远不要在实际代码中使用逗号或“反逗号”运算符。两者都可能让 future 的读者感到困惑。

    关于Perl "reverse comma operator"(来自《Programming Perl》一书的示例,第 4 版),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36849635/

    相关文章:

    linux - 如何使用 PERL 将多个 *.tgz 文件提取到多个目录?

    regex - 拆分一个逗号分隔的列表,其中文本中的逗号不会被转义

    java - 对 post++ 和 --pre 运算符的操作

    F# 三参数中缀运算符

    mysql - 为什么mysql和perl的base64字符串编码不同?

    perl - 如何优雅地从 Perl 的字符串中拆分成对的单词?

    excel - Mac Excel 2016 - 小数点而不是图表上的逗号

    list - 使用两个反引号和逗号,Common Lisp

    ruby - ruby 中的 !=~ 比较运算符是什么?

    mysql - 如何在数据库中随机字母列表的每个字母后添加逗号