perl中智能匹配运算符的意外行为
根据perlop:,以下代码:perl中智能匹配运算符的意外行为,perl,Perl,根据perlop:,以下代码: use 5.012; my @array = qw/1 2/; print @array ~~ 2 ? "true" : "false"; 我们应该使用规则 左右描述和伪代码 =============================================================== 任意Num数值相等(如:Any==Num) 但是输出是“假的”。但是我认为 @array == 2 应该是真的。哪里出错了?我不确定这个问题
use 5.012;
my @array = qw/1 2/;
print @array ~~ 2
? "true"
: "false";
我们应该使用规则
左右描述和伪代码=============================================================== 任意Num数值相等(如:Any==Num) 但是输出是“假的”。但是我认为
@array == 2
应该是真的。哪里出错了?我不确定这个问题,但这可能会有所帮助:代码编译成一个带有数组的智能匹配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
perl-MO=Deparse-e'@a=(1,2);打印2~~@a';#=>打印2~~\@a;。即使右操作数是数组,它仍然显示为引用。