当我在右侧使用范围运算符而不是数组时,为什么smartmatch会返回不同的值?

时间:2013-12-03 06:59:03

标签: perl smartmatch

为什么此smartmatch返回false

$value = 5;
print "true" if $value ~~ (1..5);

虽然这个返回true?

$value = 5;
@match = (1..5);
print "true" if $value ~~ @match;

1 个答案:

答案 0 :(得分:3)

在第一种情况下,~~运算符的右侧在标量上下文中进行计算,因此表达式1..5flip-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完成大部分任何事情的唯一推荐方式。它的大部分功能在实际应用中都太神奇了。