Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl中智能匹配运算符的意外行为_Perl - Fatal编程技术网

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

perl中智能匹配运算符的意外行为,perl,Perl,根据perlop:,以下代码: use 5.012; my @array = qw/1 2/; print @array ~~ 2 ? "true" : "false"; 我们应该使用规则 左右描述和伪代码 =============================================================== 任意Num数值相等(如:Any==Num) 但是输出是“假的”。但是我认为 @array == 2 应该是真的。哪里出错了?我不确定这个问题

根据perlop:,以下代码:

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;。即使右操作数是数组,它仍然显示为引用。