Why does this smartmatch return false
$value = 5;
print "true" if $value ~~ (1..5);
$value = 5;
@match = (1..5);
print "true" if $value ~~ @match;
In the first case, the right side of the
~~ operator is evaluated in scalar context, so the expression
1..5 is the flip-flop operator, becoming true when
$. is 1 and becoming false after
$. is 5. The true or false value of the flip-flop is then used as the RHS of the smart-match (I believe it will be treated as a numeric
1 or a string
"" respectively, but I haven't proven that).
In the second case,
@match receives the values
(1, 2, 3, 4, 5), and
$value ~~ @match is true if
$value is any one of those numbers (but not if, for instance, it's 1.5, even though that's in the range 1..5).
If what you really want is a range smartmatch, your best bet is to create a range class that takes lower and upper bounds, and provides a
~~ operator overload that returns whether the LHS falls within the range. Then you could (with the appropriate sugar) write
if $value ~~ Range(1,5). In fact, that's pretty much the only recommended way to do much of anything with smartmatch. Most of what it does is too magical for practical use.