为什么@array~~$number与@array==$number不同



根据编程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)和其他事情。

相关内容

最新更新