【问题标题】:Why does smartmatch return different values depending on the order of the operands?为什么 smartmatch 根据操作数的顺序返回不同的值?
【发布时间】:2011-03-12 00:37:29
【问题描述】:

我有一个数组,下面的测试返回 true:

1 ~~ @a

然而,以下测试返回 false:

@a ~~ 1

我在 Learning Perl 中读到,值在 smartmatch 运算符两侧的位置无关紧要,但显然在上面的代码中确实如此。这是为什么?这两个语句检查不同的东西吗?

【问题讨论】:

标签: perl smartmatch


【解决方案1】:

除了其他答案之外,the list of Perl 5.10.1 changes 有一节介绍对 ~~ 运算符所做的更改:

智能匹配运算符~~ 不再可交换。智能匹配的行为现在主要取决于其右手参数的类型。

所以 Learning Perl 在这些更改之前可能是正确的。

【讨论】:

  • 其实它在 5.10.1 中也发生了变化。
【解决方案2】:

5.10.0 中的 ~~ 版本基于当时的 perl6 设计,是可交换的。因为 5.10.0 发布的时间很长,所以到它出来的时候,perl6 smartmatch 已经有了很大的改进(包括不再是可交换的),但是 perl5 开发中没有人注意到及时修复 perl5 的实现。它在 5.10.1 中得到修复,任何人都不应依赖旧的 5.10.0 规则。对我来说,不一致的行为被记录在一本印刷书中,这对我来说是个新闻。

【讨论】:

    【解决方案3】:

    如果您转到Smart Matching in Detail,您会看到它根据其参数的顺序和类型执行非常不同的操作。

    【讨论】:

      【解决方案4】:

      如果Learning Perl 这么说,那就是错误 过时了(尽管在许多情况下它确实倾向于这样)。智能匹配运算符的作用主要由正确参数的类型决定;详情请参阅the perlsyn documentation 中的表格。

      【讨论】:

      • @Brian Roach:哈,我刚刚在 perl5101delta 中读到了这一点,同时试图弄清楚 @a ~~ 1 到底做了什么。
      猜你喜欢
      • 1970-01-01
      • 2014-10-01
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      相关资源
      最近更新 更多