智能匹配运算符未按预期工作

3
为什么智能匹配运算符~~会说0不在(0,5..100)中?
print ((0 ~~ (0, 5..100)) ? "Y" : "N");

数字N

在这里测试


1
除非在某些罕见情况下,最好不要使用智能匹配运算符。 - TLP
打印 print grep($_ == 0, 0, 5..100) ? 'Y' : 'N' 可以做同样的事情,没有歧义。 - TLP
...而且不依赖于损坏的运算符。 - ikegami
2个回答

5
使右侧成为数组引用
print ((0 ~~ [0, 5..100]) ? "Y" : "N");

或者一个命名数组
@a = (0, 5..100);
print ((0 ~~ @a) ? "Y" : "N");

或者一个......不知道叫什么(匿名命名数组?)

print ((0 ~~ @{[0,5..100]}) ? "Y" : "N");

(0,5..100)是一个列表,但它不是一个数组,这是区分它们的重要之处之一。


我知道列表和数组之间的区别,但这个运算符不应该也可以用于列表吗? - Ωmega
也许它应该这样,但是文档表明右操作数应该是一个ARRAY - mob
@Ωmega,不存在所谓的列表,"List"只是指"堆栈上的一些标量"。在这种情况下,标量的数量始终为1,因为(0, 5..100)在标量上下文中被评估。 - ikegami

2
不要使用已损坏的智能匹配运算符。0 ~~ ...被认为是其中之一的原因。
使用:
grep { $_ } 0, 5..100

或者

use List::Util qw( first );

first { $_ } 0, 5..100

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接