perl中智能匹配运算符的意外行为

时间:2012-10-30 09:48:12

标签: perl

根据perlop:Smartmatch-Operator,以下代码:

use 5.012;

my @array = qw/1 2/;

print @array ~~ 2
    ? "true"
    : "false";

应该使用规则

  

左右描述和伪代码
   ================================================== =============

     

任何Num数字相等(如:Any == Num)

但输出是“假”。但我认为

@array == 2

应该是真的。我哪里出错?

1 个答案:

答案 0 :(得分:5)

我不确定这个问题,但也许这会有所帮助:代码编译为与数组 ref 的智能匹配:

$ perl -MO=Deparse -e '@a = (1, 2); print @a ~~ 2'
@a = (1, 2);
print \@a ~~ 2;
-e syntax OK

所以你实际上是在检查引用相等性,在大多数情况下这应该是假的。 ;)但是,检查数组的长度对于智能匹配运算符来说可能太容易了,因为可以使用==完成:

$ perl -le '@a = (42, 17); print @a == 2'
1

我更喜欢这种方法,因为Perl程序员对你正在测试的内容更为明显。

请注意,智能匹配不对称。撤消订单会对该阵列执行grep搜索:

$ perl -nle '@a = (42, 17); print $_ ~~ @a ? "ok" : "no"'
1
no
2
no
17
ok