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

Re: converting from switch to given-when

by Athanasius (Monsignor)
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.

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


Comment on Re: converting from switch to given-when
Select or Download Code
Re^2: converting from switch to given-when
by tobyink (Abbot) on Sep 26, 2012 at 08:48 UTC

    Precisely.

    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?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://995728]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (7)
As of 2014-09-22 12:25 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (191 votes), past polls