#! perl -slw use strict; sub getIter{ my ($s, $e, $ref)=@_; $e = $#$ref if $e == -1; return sub { ($s < $e) ? *_ = \$ref->[$s++] : return; } } my @a = 1 .. 1000000; my $iter = getIter 500000, 500005, \@a; print while $iter->(); $iter = getIter 500000, 500005, \@a; $_ = 'modified' while $iter->(); $iter = getIter 500000, 500005, \@a; print while $iter->(); __END__ C:\test>227478 500001 500002 500003 500004 500005 modified modified modified modified modified C:\test>