in reply to fall through switch/case in perl

The inherent weakness in your query is that you are asking for a Perl equivalent to a basic 'switch' idiom, when Perl doesn't provide a 'switch' construct.

You are asking about Duff's Device ..... which, as I remember, was invented to save a couple dozen machine instructions. My understanding is that Duff's Device is mostly viewed as poor programming, since saving a few dozen machine cycles at 3 GHz is less important than leading to quick and clear reader understanding of the code. On the other hand, I can imagine programmers dealing with highly-efficient code, such as embedded programmers, might accept Duff as an easily recognized idiom.

So the next question is, without a switch statement, how would we implement Duff?

We've had one suggestion, using substr(), very closely related to the details of this question.

More generally, you might consider re-framing the conditionals:

for my $val ( $var ) { print "a" if ( $val >= 10 ); print "b" if ( $val >= 9 ); print "c" if ( $val >= 8 ); print "d" if ( $val >= 7 ); print "e" if ( $val >= 6 ); print "f" if ( $val >= 5 ); print "g" if ( $val >= 4 ); print "h" if ( $val >= 3 ); print "i" if ( $val >= 2 ); print "j" if ( $val >= 1 ); }

So, yes, it can be achieved, but you need to think somewhat differently.

--
TTTATCGGTCGTTATATAGATGTTTGCA

Replies are listed 'Best First'.
Re^2: fall through switch/case in perl
by BrowserUk (Patriarch) on Sep 07, 2004 at 02:23 UTC

    Actually, this is just a standard switch statement,-- not Duff's device.

    On the clarity argument, it's very much in the eye of the beholder whether your if cascade (or the and cascade) is clearer than the computed-goto version?

    For completeness, the computed goto version works out an average of over 60% faster than either of the cascade versions, which is rather more than a few dozen clock cycles.


    Examine what is said, not who speaks.
    "Efficiency is intelligent laziness." -David Dunham
    "Think for yourself!" - Abigail
    "Memory, processor, disk in that order on the hardware side. Algorithm, algorithm, algorithm on the code side." - tachyon

      That's because it doesn't test and retest conditions like the cascades do, it just computes a goto target.

      Makeshifts last the longest.

        I know that! And that's why it's a better conversion of the c switch statement.


        Examine what is said, not who speaks.
        "Efficiency is intelligent laziness." -David Dunham
        "Think for yourself!" - Abigail
        "Memory, processor, disk in that order on the hardware side. Algorithm, algorithm, algorithm on the code side." - tachyon
Re^2: fall through switch/case in perl
by Anonymous Monk on Sep 07, 2004 at 08:48 UTC
    1. The OP isn't asking about Duff's device.
    2. Your code isn't Duff's device either.
    3. Your code is inefficient (it's always doing 10 comparisons).
    4. Your code has a pointless for loop.