in reply to Re^2: grep, map vs. foreach performance
in thread grep, map vs. foreach performance

while is for...

> perl -MO=Deparse -e"for(;;){}" for (;;) { (); } -e syntax OK > perl -MO=Deparse -e"while(1){}" for (;;) { (); } -e syntax OK > perl -MO=Deparse -e"for(1){}" foreach $_ (1) { (); } -e syntax OK >

~Particle *accelerates*

Replies are listed 'Best First'.
Re^4: grep, map vs. foreach performance
by Flexx (Pilgrim) on Sep 04, 2002 at 14:26 UTC
    > perl -MO=Deparse -e 'while($x++ < 10){}' while ($x++ < 10) { (); }

    Now, why is that? Shouldn't that be

    for(;$x++ < 10;){}

    then? On the contrary actually:

    > perl -MO=Deparse -e 'for(;();){}' while (()) { (); }

    So, it seems that while is for only for the obvious endless loop, and in other cases for is while (as I had expected...)

    However, I am intriqued by the fact that

    > perl -MO=Deparse -e 'for($x;$y;$z){()}' for ($x; $y; $z) { (); }

    and not

    { $x; while($y) { (); } continue { $z; } }

    (at least not on the Perl level of things).

    Cool stuff anyway! Thanks a million. I learned a lot from your reply. I flew over the optimizer and Deparse a few times (mostly when searching for other things), but using it that way looks powerful. Got any pointers to good information on it? Is there some "How to wrink the guts out of your script using -MO=Deparse/the Optimizer" somewhere?

    So long,
    Flexx

    (I like the photo on your home node, BTW).

Re^4: grep, map vs. foreach performance
by sauoq (Abbot) on Sep 04, 2002 at 21:57 UTC

    No, while isn't for. It is optimized to a for(;;) in the case where it is used as while(SOME_TRUE_CONSTANT). It is also optimized away in the case where it is used as while(SOME_FALSE_CONSTANT).

    $ perl -MO=Deparse -e 'while (0) {}' ; -e syntax OK $ perl -MO=Deparse -e 'while (1) {}' for (;;) { (); } -e syntax OK $ perl -MO=Deparse -e 'while (@_) {}' while (@_) { (); } -e syntax OK

    For that matter, even though for and foreach are synonymous, what's in the parens determines how perl actually parses them:

    $ perl -MO=Deparse -e 'for (;;) {}' for (;;) { (); } -e syntax OK $ perl -MO=Deparse -e 'foreach (;;) {}' for (;;) { (); } -e syntax OK $ perl -MO=Deparse -e 'for (@_) {}' foreach $_ (@_) { (); } -e syntax OK $ perl -MO=Deparse -e 'foreach (@_) {}' foreach $_ (@_) { (); } -e syntax OK
    -sauoq
    "My two cents aren't worth a dime.";