my $iterator = &foo(); while($iterator->()) { # do something } #### sub foo { return sub { # some code }; } #### my $even = &even_numbers(1000); while (my $n = $even->()) { print "$n\n"; sleep(1); } sub even_numbers { my $number = shift; $number-- unless ($number % 2); return sub { $number += 2 }; }