根据 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
不同?
答案 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)
和其他事项。