3

根据Programming Perl,使用左边的“any”和右边的数字的智能匹配检查数字是否相等:

------------------------------------------------------------------------------
| 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?

4

2 回答 2

3

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;
于 2012-07-28T14:47:14.937 回答
2

那是因为 smartmatch 首先需要一个参考。@array ~~ $num将等价于\@array == $num,这显然不太可能是真的。

您可能想以一种不出所料的方式使用我的Smart::Match模块和 do@array ~~ array_length($num)以及@array ~~ contains($num)其他东西。

于 2012-07-28T11:41:18.523 回答