in reply to Re: Avoiding if/else knots II
in thread Avoiding if/else knots II

I'm asking myself what's the advantage of first mapping values to keys and then dispatching the keys via a hash table instead of skipping the key and dispatching directly.

So in all the cases where you have a $key= somethin you could also write down a call of a subroutine handling this key. Except for the default case of course.

I'd write your example like this:

SWITCH: for ( $myValue ) { /$reg2/ && do { sub_for_key_a(); last SWITCH; }; /$reg1/ && do { whatever(); sub_for_key_b(); last SWITCH; }; #default sub_for_default(); } # END SWITCH

s$$([},&%#}/&/]+}%&{})*;#$&&s&&$^X.($'^"%]=\&(|?*{%
+.+=%;.#_}\&"^"-+%*).}%:##%}={~=~:.")&e&&s""`$''`"e

Replies are listed 'Best First'.
Re^3: Avoiding if/else knots II
by shmem (Chancellor) on Aug 30, 2006 at 09:43 UTC
    TIMTOWTDI - I wanted to give an example of the m// && do {} idiom which was missing from the OP's previous thread. Since I don't know about the specifics, I wrote it somewhat generic. Depending on cases the $key or $case could be modified etc.

    As for your example, what good is it to use a labelled loop for a list containing one variable? ;-)

    --shmem

    _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                  /\_¯/(q    /
    ----------------------------  \__(m.====·.(_("always off the crowd"))."·
    ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}
      As for your example, what good is it to use a labelled loop for a list containing one variable? ;-)

      That's easy.

      1. The label is there to show that the block is emulating as a SWITCH statement.
      2. The label is also there to show what the last statements refer to.
      3. the for with just one variable is simply there to assign $value to $_ without explicitly doing it
      4. it's also there to keep the original content of $_ outside the SWITCH ("loop"). Try this
        my $v="V"; $_="_"; for ( $v ) { print "inside: $_\n"; } print "outside: $_\n";
      5. It looks good ;-) (to me). I read this as "switch for value ..."

      s$$([},&%#}/&/]+}%&{})*;#$&&s&&$^X.($'^"%]=\&(|?*{%
      +.+=%;.#_}\&"^"-+%*).}%:##%}={~=~:.")&e&&s""`$''`"e
        It looks good ;-) (to me). I read this as "switch for value ..."

        Ah, style. Still, I deem it a misuse of for. It sets up the context of a loop whilst none needed.

        This one looks better (for me, that is :-)

        # SWITCH { local $_ = $MyValue; /$reg2/ && do { sub_for_key_a(); last; }; /$reg1/ && do { whatever(); sub_for_key_b(); last; }; #default sub_for_default(); } # END SWITCH
        since a bare block does the job and is less clutter. And I also read it as "switch for $MyValue" ;-)

        --shmem

        _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                      /\_¯/(q    /
        ----------------------------  \__(m.====·.(_("always off the crowd"))."·
        ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}