2

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

use 5.012;

my @array = qw/1 2/;

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

应该使用规则

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

Any Num 数值相等(如:Any == Num)

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

@array == 2

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

4

1 回答 1

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
于 2012-10-30T10:01:41.830 回答