### Re^6: fall through switch/case in perl

by tachyon (Chancellor)
 on Sep 07, 2004 at 00:49 UTC ( #388895=note: print w/replies, xml ) Need Help??

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

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

Replies are listed 'Best First'.
Re^7: fall through switch/case in perl
by Rhys (Pilgrim) on Sep 07, 2004 at 11:47 UTC
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)?

```\$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. :-)

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.
Re^7: fall through switch/case in perl
by Aristotle (Chancellor) on Sep 07, 2004 at 01:04 UTC

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

Makeshifts last the longest.

As you say, it is not equivalent. To do that you need some extra checks at the top of the 'loop' ie

```  last unless /^\d+\$/ and \$_ <= 10;

It is almost certainly a silly way to do it in Perl anyway. It is even a rather suboptimal way to do it in C.....

```for(i=0;i<var;i++) printf( "%c", 97+i ); /* C or perl */

print map chr,97..96+\$var;

cheers

tachyon

I don't mean the extra checks. I mean it doesn't preserve the semantics. Imagine if the OP's code didn't have the conditions in a strictly monotonic increasing or decreasing sequence, but in some completely random order. You couldn't emulate that simply by fiddling the conditions a little — you'd have to build a construct that's actually equivalent.

Makeshifts last the longest.

Create A New User
Node Status?
node history
Node Type: note [id://388895]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (7)
As of 2020-11-26 07:43 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?

No recent polls found

Notices?