According to Programming Perl, using smartmatch with “any” on the left and a number on the right checks numeric equality:
------------------------------------------------------------------------------
| Left | Right | Description | Like (But Evaluated in Boolean Context) |
------------------------------------------------------------------------------
| Any | Num | Numeric equality | Any == Num |
Therefore, I expect the following to output 1:
my @arr = ('aaa');
my $num = 1;
say @arr ~~ $num;
but it actually outputs the empty string.
I thought @arr would be converted to scalar 1 because it has 1 element, so say @arr ~~ $num would be equivalent to say @arr == $num.
Why is @arr ~~ $num different from @arr == $num?
The smartmatch operator obviously doesn’t take lists as operands. As such, it evaluates its operands in scalar context. If that was the end of the story, the following wouldn’t work
because it would be the same as
But it’s clear that it does work. That’s because smartmatch automatically creates a reference to its operands that are arrays or hashes, just like
pushdoes to its first operand. That meansis really
and (your code)
is the same as
You need to get the length explicitly. The following will do what you want:
Of course, so would
or even