Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Re^4: grep, map vs. foreach performance

by Flexx (Pilgrim)
on Sep 04, 2002 at 13:04 UTC ( [id://195062]=note: print w/replies, xml ) Need Help??


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

Ok, that's synonymous. Yet, unless I got something completely wrong (then please correct me), constructs like

for($i=0; $i < @array; $i++){ print $array[$i]++ }; # Thanks for the dollar, jeffa ;)

and
foreach(@array){ print $_++;  };

do something different internally. Of course, the second is generally the better/faster approach (unless you don't need $i for something else in the loop, since $i is an unnecessary artificial variable in the first example)).

So long,
Flexx

Replies are listed 'Best First'.
(jeffa) 5Re: grep, map vs. foreach performance
by jeffa (Bishop) on Sep 04, 2002 at 14:50 UTC
    It's really quite simple - for and foreach are the same. When you don't care about the value of the current index, don't use it:
    @array = ('a'..'z'); print $_,$/ for @array;
    When you do care about the value of the current index, do use it:
    printf "%02d: %s\n", $_+1, $array[$_] for 0..$#array;
    When in doubt, check with Deparse.pm:
    $ perl -MO=Deparse foo.pl @array = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'); foreach $_ (@array) { print $_, $/; } foreach $_ (0 .. $#array) { printf "%02d: %s\n", $_ + 1, $array[$_]; } foo.pl syntax OK

    jeffa

    L-LL-L--L-LL-L--L-LL-L--
    -R--R-RR-R--R-RR-R--R-RR
    B--B--B--B--B--B--B--B--
    H---H---H---H---H---H---
    (the triplet paradiddle with high-hat)
    

      Hmm.. You missed my point (or you're repeating what I said). I wasn't comparing for(ARRAY) with for(TEMP_ARRAY), but for(ARRAY) with for(EXPR;EXPR;EXPR).

      I do know that for and foreach are synonymous words. I was trying to clarify that in

      for (@array) {$_++}

      $_ is an implicit alias for the current @array element. While in

      for (0 .. $#array) {$array[$_]++}

      $_ an alias for the current index. And that, in terms of what to use for what (as you already clarified) was the difference I meant...

        I do know that for and foreach are synonymous words. I was trying to clarify that in
        for (@array) {$_++}
        $_ is an implicit alias for the current @array element. While in
        for (0 .. $#array) {$array[$_]++}
        $_ an alias for the current index.

        In your second example there, perl has no idea that $_ is an alias for the "current index." All it knows is that it is an alias for the current list element. The difference between the two examples is only in the contents of the list that the for statement is iterating over.

        -sauoq
        "My two cents aren't worth a dime.";
        

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others imbibing at the Monastery: (2)
As of 2024-04-20 01:53 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found