Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery

Re: converting from switch to given-when

by Athanasius (Chancellor)
on Sep 26, 2012 at 08:07 UTC ( #995728=note: print w/replies, xml ) Need Help??

in reply to converting from switch to given-when

(Replying to the Update in the OP.)
The when ([wxID_YES]) {....} also works (why?)

I also wondered that. :-) Here is the answer I came up with:

  1. 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.

  2. 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.
  3. Also from Smartmatch Operator:

    Right operand is an ARRAY: ... Any ARRAY smartmatch each ARRAY element like: grep { Any ~~ $_ } ARRAY
  4. and

    Num nummy numeric equality like: Num == nummy

    where nummy is defined as

    Either an actual number, or a string that looks like one.


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

Replies are listed 'Best First'.
Re^2: converting from switch to given-when
by tobyink (Abbot) on Sep 26, 2012 at 08:48 UTC


    Smartmatch is easy. (Except when it isn't.)

    perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://995728]
[stevieb]: My GPIO expander chips should arrive tomorrow, but I think I'll throw a shift register against them and see if all six I have will turn at once. Amps are near the breaking point, but I want to know max sustainable V and I output.

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (6)
As of 2018-03-22 22:18 GMT
Find Nodes?
    Voting Booth?
    When I think of a mole I think of:

    Results (286 votes). Check out past polls.