sub iter { my $vals = \@_; my $i = 0; sub { $i >= @$vals ? do { $i = 0; undef } : $vals->[$i++]; }; } sub enumerate_iter { local $Data::Dumper::Indent = 0; local $Data::Dumper::Terse = 1; my ($iter) = @_; my $i = 0; while (defined($_ = $iter->())) { printf "%2d: (%s)\n", $i++, Dumper($_); } print "\n"; } enumerate_iter( iter( qw[a b c] ) ); # 0: ('a') # 1: ('b') # 2: ('c')