Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re^4: fall through switch/case in perl

by tachyon (Chancellor)
on Sep 07, 2004 at 00:44 UTC ( [id://388893]=note: print w/replies, xml ) Need Help??


in reply to Re^3: fall through switch/case in perl
in thread fall through switch/case in perl

The comment that your code is wrong and does not fall through is accurate. I did run the code, not that it necessary. Set $var to 10 it prints only 'a' and does not fall through the b c d cases as with a C fall through.

cheers

tachyon

Replies are listed 'Best First'.
Re^5: fall through switch/case in perl
by Aristotle (Chancellor) on Sep 07, 2004 at 00:46 UTC

    Yes — doy. Execution does fall through to the next condition, but I missed the fact that that alone doesn't make the condition true. Out of my mind, back in five minutes.

    Makeshifts last the longest.

      s/==/>=/g and it falls through ie
      for ( $var ) { $_ >= 10 and print "a"; $_ >= 9 and print "b"; $_ >= 8 and print "c"; $_ >= 7 and print "d"; $_ >= 6 and print "e"; $_ >= 5 and print "f"; $_ >= 4 and print "g"; $_ >= 3 and print "h"; $_ >= 2 and print "i"; $_ >= 1 and print "j"; }

      cheers

      tachyon

        While Aristotle posted a solution that more closely approximates the switch/case behavior, but - aside from the additional tests - isn't yours the better way to do it in Perl (meaning that it's a hell of a lot more readable as the number of cases grows)?

        Or what about:

        $accum = ''; for ( $var ) { if ( $_ < 1 ) { last; } else { $accum = 'j'.$accum; } if ( $_ < 2 ) { last; } else { $accum = 'i'.$accum; } if ( $_ < 3 ) { last; } else { $accum = 'h'.$accum; } if ( $_ < 4 ) { last; } else { $accum = 'g'.$accum; } if ( $_ < 5 ) { last; } else { $accum = 'f'.$accum; } if ( $_ < 6 ) { last; } else { $accum = 'e'.$accum; } if ( $_ < 7 ) { last; } else { $accum = 'd'.$accum; } if ( $_ < 8 ) { last; } else { $accum = 'c'.$accum; } if ( $_ < 9 ) { last; } else { $accum = 'b'.$accum; } $accum = 'a'.$accum; }
        Wouldn't that be similar, but provide a shortcut out (so we don't always run ten tests)? Also, push-ing onto an array and join-ing it at the end might be a little more flexible than the . operator...

        Just musing (as usual)...

        --J

        Update: The examples using goto further down are even faster (fewer tests) and preserve the fallthrough and the ability to execute arbitrary code in each case (rather than literally doing string manipulation), but you get an earful from purists when you use goto. :-)

        Yes, but that's not equivalent to the OP's code.

        Makeshifts last the longest.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others meditating upon the Monastery: (4)
As of 2024-04-19 11:30 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found