To know what test ~~ will perform, we need to know what the arguments to it will be.
Remember that X is a function or at acts least like a function, and that functions are evaluated in scalar or list context. To know what X returns, we need to know in which context it was called.
By definition, binary operators (such as smart matching) operate on two single values. They impose a scalar context on their operands. Given that the comma operator returns its RHS when evaluated in scalar context, the context is made evident by the following test:
>perl -E"say 'ok' if 'a' ~~ ('a', 'b');" >perl -E"say 'ok' if 'b' ~~ ('a', 'b');" ok
That means
say "ok" if "a" ~~ X;
is the same as
say "ok" if "a" ~~ scalar(X);
So what does X return in scalar context? Well, it's undocumented, and I daresay it's possible that it could change at any time. You shouldn't count on it.
One solution to your problem is to create an array.
>perl -E"use constant X => qw(a b c); say 'ok' if 'a' ~~ @{[ X ]}" ok
In reply to Re: 5.10 smart match behaviour
by ikegami
in thread 5.10 smart match behaviour
by zgrim
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |