http://qs321.pair.com?node_id=388995


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

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. :-)

Replies are listed 'Best First'.
Re^8: fall through switch/case in perl
by tachyon (Chancellor) on Sep 07, 2004 at 11:54 UTC

    Personally I think that given perl has for, foreach, do, while, until, map, grep and all sorts of other operators that the case statement should have been part of the language from the start. You don't *need* it. In fact you don't need for or while or.... All you really need is goto and if which is how it gets implmented in assembler anyway, but that is hardly the point....

    cheers

    tachyon

      If you look at the wishlist of perl-1.0.0, you'll notice that it mentions switch. So, Larry thought, at least at the start, so too.

        Larry always thought so. As he explains in whatever Apocaplypse explains given/when, the reason Perl hasn't had a switch statement is that everyone else's switch statements suck, and he preferred to have none rather than a bad one.

        Given that the language was being overhauled completely for Perl6, he took the time to do it in a way he considers right. Indeed you will notice that the semantics of Perl6's given/when go quite a way beyond those of switch in most languages, both in terms of possible conditionals and of non-/fallthrough behaviour.

        Makeshifts last the longest.