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

时间:2012-07-28 09:57:38

标签: perl smartmatch

根据 Programming 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不同?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

那是因为smartmatch首先引用了一个引用。 @array ~~ $num等同于\@array == $num,显然非常不可能是真的。

您可能希望使用我的Smart::Match模块并以非令人惊讶的方式执行@array ~~ array_length($num)@array ~~ contains($num)和其他事项。