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