Perl中智能匹配操作员的意外行为



根据perlop:smartmatch-operator,以下代码:

use 5.012;
my @array = qw/1 2/;
print @array ~~ 2
    ? "true"
    : "false";

应使用规则

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

任何数字平等(例如:any == num)

但是输出是" false"。但我认为

@array == 2

应该是真实的。我在哪里错了?

我不确定这个问题,但这也许会有所帮助:代码与数组 ref commiles commiles commiles:

$ 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

最新更新