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: #### while ( countdown $limit => my $a ) { .... }