2011-03-12 24 views
9

我有这下面的测试返回true数组:为什么smartmatch根据操作数的顺序返回不同的值?

1 ~~ @a 

然而,下面的测试返回false:

@a ~~ 1 

学习Perl的读取值的位置在smartmatch运营商的任何一方并不重要,但显然在上面的代码中它确实如此。这是为什么?这两个陈述检查不同的东西吗?

+1

http://www.learning-perl.com/?p=32 – Hugmeir 2011-03-12 04:24:51

+0

太棒了!感谢您的链接。 – 2011-03-12 18:47:35

回答

13

除了其他的答案,the list of Perl 5.10.1 changes有到~~运营商所做的更改一节:

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

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

+5

其实在5.10.1中也改变了。 – 2011-03-12 01:24:20

5

如果学习的Perl说,这是错误的 过时 (尽管它往往在很多情况下出现这样的工作)。智能匹配算子的功能主要取决于正确参数的类型;具体请参见the perlsyn documentation中的表格。

+1

这是写的正确:) – 2011-03-12 00:56:16

+0

@布莱恩罗奇:哈,我刚刚读了perl5101delta,同时试图找出究竟是什么'@a ~~ 1'。 – Anomie 2011-03-12 01:00:59

5

如果你去Smart Matching in Detail,你可以看到它根据它的参数的顺序和类型做了非常不同的事情。

11

5.10.0中的~~版本基于当时的perl6设计,它是可交换的。因为5.10.0花了很长时间才能发布,到它出来的时候,perl6智能匹配已经大大改进了(包括不再可交换),但perl5开发中没有人注意到及时修复perl5的实现。它在5.10.1中得到修复,没有人应该依赖较早的5.10.0规则。对我而言,这种不一致的行为在一本印刷书中得到了记录。

相关问题