Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
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 wandering the Monastery: (6)
As of 2014-07-23 04:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (133 votes), past polls