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; }