9

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

1 ~~ @a

然而,以下测试返回 false:

@a ~~ 1

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

4

4 回答 4

13

除了其他答案之外,Perl 5.10.1 更改列表中还有一个关于对操作符所做更改的部分~~

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

因此,在这些更改之前学习 Perl可能是正确的。

于 2011-03-12T00:54:05.890 回答
11

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

于 2011-03-12T01:00:44.420 回答
5

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

于 2011-03-12T00:46:57.653 回答
5

如果您转到详细智能匹配,您会看到它根据其参数的顺序和类型做了非常不同的事情。

于 2011-03-12T00:48:32.673 回答