#!/usr/bin/perl use strict; use warnings; { my %seen; sub iter { my ($beg, $end, $by) = @_; my $key = join '*', caller(); return $seen{$key}->() if $seen{$key}; my $pos = $beg - $by; $seen{$key} = sub { $pos += $by; if ($pos > $end) { delete $seen{$key}; return; } return $pos; }; return $seen{$key}->(); } } while (my $x = iter(1, 10, 1)) { print "$x\n"; while (my $y = iter(1, 10, 1)) { print "$x - $y\n"; } }