根据编程Perl,使用左边有"any"右边有数字的smartmatch检查数值相等:
------------------------------------------------------------------------------
| Left | Right | Description | Like (But Evaluated in Boolean Context) |
------------------------------------------------------------------------------
| Any | Num | Numeric equality | Any == Num |
因此,我期望以下输出1
:
my @arr = ('aaa');
my $num = 1;
say @arr ~~ $num;
但是它实际上输出空字符串。
我认为@arr
会被转换为标量1
,因为它有1个元素,所以say @arr ~~ $num
将等价于say @arr == $num
。
为什么@arr ~~ $num
与@arr == $num
不同?
smartmatch运算符显然不将列表作为操作数。因此,它在标量上下文中评估其操作数。如果故事到此结束,以下内容将不起作用
my @a = ('aaa', 'bbb');
my $s = 'aaa';
say $s ~~ @a;
因为它将与相同
say 'aaa' ~~ 2;
但很明显,它确实有效。这是因为smartmatch会自动创建对其操作数(数组或散列)的引用,就像push
对其第一个操作数所做的那样。这意味着
say $s ~~ @a;
真的是
say $s ~~ @a;
和(你的代码)
say @a ~~ $n;
与相同
say @a == $n;
您需要明确地获取长度。以下内容将满足您的要求:
say 0+@a ~~ $n;
当然,也会
say 0+@a == $n;
甚至
say @a == $n;
这是因为smartmatch首先获取引用。@array ~~ $num
将等同于@array == $num
,这显然不太可能是真的。
您可能想使用我的Smart::Match模块,并以一种不奇怪的方式执行@array ~~ array_length($num)
、@array ~~ contains($num)
和其他事情。