C:\test>p1 perl> sub getIter{ my ($s,$e,$ref)=@_; $e=$#$ref if $e==-1; return sub { $s<=$e ? $ref->[$s++] : (); }} perl> @a = 1 .. 1000000 perl> $iter = getIter 500000, 500005, \@a perl> print while $_ = $iter->() 500001500002500003500004500005500006 perl> #### #! perl -slw use strict; sub getIter{ my ($start, $end, $aryRef) = @_; $end = $#$aryRef if $end == -1; return sub { return $aryRef->[$start++] if $start < $end; (); } } my @a = 1 .. 1000000; my $iter = getIter 500000, 500005, \@a; print while $_ = $iter->(); __END__ 500001 500002 500003 500004 500005 #### #! 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> #### #! perl -slw use strict; $_ = 'some value'; print; for (1 .. 10) { print; } print; __END__ C:\test>temp some value 1 2 3 4 5 6 7 8 9 10 some value C:\test>