【发布时间】:2011-03-12 00:37:29
【问题描述】:
我有一个数组,下面的测试返回 true:
1 ~~ @a
然而,以下测试返回 false:
@a ~~ 1
我在 Learning Perl 中读到,值在 smartmatch 运算符两侧的位置无关紧要,但显然在上面的代码中确实如此。这是为什么?这两个语句检查不同的东西吗?
【问题讨论】:
标签: perl smartmatch
我有一个数组,下面的测试返回 true:
1 ~~ @a
然而,以下测试返回 false:
@a ~~ 1
我在 Learning Perl 中读到,值在 smartmatch 运算符两侧的位置无关紧要,但显然在上面的代码中确实如此。这是为什么?这两个语句检查不同的东西吗?
【问题讨论】:
标签: perl smartmatch
除了其他答案之外,the list of Perl 5.10.1 changes 有一节介绍对 ~~ 运算符所做的更改:
智能匹配运算符
~~不再可交换。智能匹配的行为现在主要取决于其右手参数的类型。
所以 Learning Perl 在这些更改之前可能是正确的。
【讨论】:
5.10.0 中的 ~~ 版本基于当时的 perl6 设计,是可交换的。因为 5.10.0 发布的时间很长,所以到它出来的时候,perl6 smartmatch 已经有了很大的改进(包括不再是可交换的),但是 perl5 开发中没有人注意到及时修复 perl5 的实现。它在 5.10.1 中得到修复,任何人都不应依赖旧的 5.10.0 规则。对我来说,不一致的行为被记录在一本印刷书中,这对我来说是个新闻。
【讨论】:
如果您转到Smart Matching in Detail,您会看到它根据其参数的顺序和类型执行非常不同的操作。
【讨论】:
如果Learning Perl 这么说,那就是错误 过时了(尽管在许多情况下它确实倾向于这样)。智能匹配运算符的作用主要由正确参数的类型决定;详情请参阅the perlsyn documentation 中的表格。
【讨论】:
@a ~~ 1 到底做了什么。