http://www.perlmonks.org?node_id=634050


in reply to Automatic Loop Counter not in perl

One thing I don't like about your proposed variable is that as far as I can see, you'd have to do additional assignment of the $LOOPCOUNTER variable if you want to nest loops.

I prefer the way more "functional/OO" languages like javascript and ruby implement foreach loops using callbacks with explicit parameters. Something that's easy to implement in perl for fullblown objects:

$list->foreach( sub { my ($element,$index) = @_; print "$index $element\n"; });
If perl's prototypes would work for methods, you could build something very close to ruby's
list.each_with_index { |element,index| print "#{index} #{element}\n" };

For completeness, here's the javascript version:

array.forEach(function(element,index) { document.write(index+" "+element+"\n"); // depending on the host });
Note that ruby & javascript's versions also have the advantage of being easily overridable for any object (including "standard arrays", since both allow methods to be attached to objects instead of only to "object types" / classes - and, of course, in both languages arrays are always "real" objects).

updated: fixed typo, slight cleanup of wording.