http://qs321.pair.com?node_id=1214094

LanX has asked for the wisdom of the Perl Monks concerning the following question:

For an iterator to work in Perl one needs to initialize it properly

use strict; use warnings; use Data::Dump qw/pp dd/; for my $limit (reverse 1..5) { for ( my $iter = countdown($limit); $iter->(my $a) ; ) { print "$a: "; } print "\n"; } sub countdown{ my $val = shift; my $iter = sub { if ($val--) { $_[0]=$val; return 1; } return; # stop iteration }; return $iter; }
4: 3: 2: 1: 0: 3: 2: 1: 0: 2: 1: 0: 1: 0: 0:

(I used c-style for here for clarity*)

But I'd rather like to stay DRY and to write something like

while ( countdown $limit => my $a ) { .... }

Where countdown can elaborate if the loop is (re)entered and does the init step automatically.

NB: Other languages have this feature for so called iterator objects.

I'm wondering if this could be tricked into Perl without XS wizardy ...

Approaches ...
IDEAS?

Cheers Rolf
(addicted to the Perl Programming Language and ☆☆☆☆ :)
Wikisyntax for the Monastery

*) please note that while(CODE){} and for(;CODE;){} have the same effect.

) many issues could be solved like this...

update

The countdown iterator was used for demonstration only, I now plenty of ways to countdown. Iterators are a general issue.