in reply to 5.10 smart match behaviour

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