sub seq { my($v, $i) = ($_[0], $_[1] || 5); my $n = 0; return sub { $n ? ($n += $i) : ($n = $v) }; } my $iter = seq 8 % 3, 5; print join ', ' => map $iter->(), 1 .. 5; print " ...\n"; $iter = seq 8 % 5; print join ', ' => map $iter->(), 1 .. 5; print " ...\n"; __output__ 2, 7, 12, 17, 22 ... 3, 8, 13, 18, 23 ...