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