Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re: Perlplexation - foreach shoulda Known

by Riales (Hermit)
on Apr 13, 2012 at 19:58 UTC ( #964980=note: print w/ replies, xml ) Need Help??


in reply to Perlplexation - foreach shoulda Known

Sort of on the same topic (but maybe a bit in the opposite direction), does anybody know if there is a special variable that keeps count of which iteration in a for loop it's on?

Say I want to do something to every third element:

my $i = 0; foreach my $element (@array) { do_something($element) unless ($i++ % 3); }

Is there a special variable that tracks what $i is tracking in that example?


Comment on Re: Perlplexation - foreach shoulda Known
Select or Download Code
Re^2: Perlplexation - foreach shoulda Known
by davido (Archbishop) on Apr 13, 2012 at 20:23 UTC

    There is not. If you're reading a file $. contains the file's line number. But if you're iterating over elements in an array it may make sense in some situations to iterate over the index instead:

    foreach my $idx ( 0 .. $#array ) { do_something($array[$idx]) unless $idx % 3; # Do something else that isn't filtered by iteration number. }

    In your example, it's probably clearer to iterate over the list rather than the indices, but in some cases the code becomes clearer the other way.


    Dave

Re^2: Perlplexation - foreach shoulda Known
by JavaFan (Canon) on Apr 13, 2012 at 20:29 UTC
    Is there a special variable that tracks what $i is tracking in that example?
    No. If you want that, use a C-style for loop. A reason not to have an special variable with an interation counter: how should that work with nested loops?

      I would think it could work the same way the $_ variable works in nested loops...

        Ah, you mean, "$_ is the default iterator value, but it's easily replaced by another variable"? How should that work for the loop counter?
Re^2: Perlplexation - foreach shoulda Known
by chromatic (Archbishop) on Apr 13, 2012 at 20:55 UTC

      Wow, cool! Thanks for pointing this out. I was always curious why something like this didn't exist--turns out it did all along!

        turns out it did all along!

        um... Only if the world began with Perl 5.12.

Re^2: Perlplexation - foreach shoulda Known
by eyepopslikeamosquito (Canon) on Apr 13, 2012 at 21:51 UTC

    Is there a special variable that tracks what $i is tracking in that example?
    Curiously, this is very easy in Python:
    x = [ 'apple', 'banana', 'orange' ] for i, val in enumerate(x): print i, val
    which prints:
    0 apple 1 banana 2 orange
    and fairly easy in Ruby:
    x = [ 'apple', 'banana', 'orange' ] x.each_with_index { |val, i| print "#{i} #{val}\n" }
    and I'm sure (need to wait for moritz to show me how) it's easy in Perl 6 too (probably via Array kv and/or pairs methods?).

    I was hoping List::Util or List::MoreUtils might have something nice, but the best I could find is to use an iterator like so:

    use List::MoreUtils qw(each_array); my @x = ( 'apple', 'banana', 'orange' ); my $it = each_array( @{[0..$#x]}, @x ); while ( my ($i, $val) = $it->() ) { print "$i $val\n"; }
    which is horrific. Is there a better way in List::Util or List::MoreUtils that I missed?

    While I was writing this, chromatic showed how to do it in Perl 5.12 or above:

    my @x = ( 'apple', 'banana', 'orange' ); while ( my ($i, $val) = each @x ) { print "$i $val\n"; }

      eyepopslikeamosquito writes:
      Curiously, this is very easy in Python...
      And Riales's task too: remember -- slices win ;-)
      for elem in some_iterable[::3]: do_something(elem)
      Then again, I'd argue that it's really not so curious given how much iteration support/use/avoidance is baked-in (iterator and sequence protocols, generators, comprehensions, slices, etc).

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (6)
As of 2015-07-03 20:43 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (56 votes), past polls