为什么此智能匹配返回错误
$value = 5;
print "true" if $value ~~ (1..5);
而这个结果是真的?
$value = 5;
@match = (1..5);
print "true" if $value ~~ @match;
在第一种情况下,~~
运算符的右侧在标量上下文中求值,因此表达式1..5
是触发器运算符,当$.
为1时变为true,而当$.
为5时变为false。触发器的真值或假值然后被用作智能匹配的RHS(我相信它将分别被视为数字1
或字符串""
,但我还没有证明这一点)。
在第二种情况下,@match
接收值(1, 2, 3, 4, 5)
,如果$value
是这些数字中的任何一个,则$value ~~ @match
为真(但如果它是1.5,则不是,即使它在1..5的范围内)
如果你真正想要的是范围智能匹配,那么最好的办法是创建一个范围类,该类具有下限和上限,并提供~~
运算符重载,该重载返回LHS是否在范围内。然后你可以(用适当的糖)写if $value ~~ Range(1,5)
。事实上,这几乎是唯一推荐的使用smartmatch完成任何的方法。它的大部分功能都太神奇了,不适合实际使用。