The when ([wxID_YES]) {....} also works (why?)
I also wondered that. :-) Here is the answer I came up with:
From Experimental Details on given and when, it is clear that this is not one of the “10 exceptional cases” in which the expression is treated as a boolean. Therefore, smartmatching applies.
From Smartmatch Operator:
The smartmatch implicitly dereferences any non-blessed hash or array r +eference, so the HASH and ARRAY entries apply in those cases.
Also from Smartmatch Operator:
Right operand is an ARRAY: ... Any ARRAY smartmatch each ARRAY element like: grep { Any ~~ $_ } ARRAY
and
Num nummy numeric equality like: Num == nummy
where nummy is defined as
Either an actual number, or a string that looks like one.
So,
when ([wxID_YES])creates an anonymous array reference, and populates the array with the result of calling wxID_YES() — namely, 5103 — then it dereferences the array reference (1) & (2), and performs a smartmatch on the elements (3), effectively:
grep { $selection ~~ $_ } (5103)
which (4) reduces to:
$selection == 5103
which actually succeeds in being DWIM.
All clear now? ;-)
* * *
Also interesting is tobyink’s observation about constant, because
use constant FOO => 42;
is implemented as a subroutine named FOO. The significant point is that this subroutine is prototyped to take no arguments:
sub FOO() { return 42; }
which (together with some other requirements) allows Perl to inline it — that is, wherever FOO appears in the code (outside of quotes), it is replaced with the value 42, so smartmatching just works as expected. See Constant Functions.
Athanasius <°(((>< contra mundum
In reply to Re: converting from switch to given-when
by Athanasius
in thread converting from switch to given-when
by jmlynesjr
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |