for my $i ( 1..9 ) { print $i } for my $i ( range(1,9) ) { print $i } { my $i; while ( range 1,9 => $i ) {...} } { my $iter = range(1,9); while ( $iter->(my $i) ) {...} } #### sub range { my $start = shift; my $end = shift; if (!@_) { if (wantarray()) { return $start .. $end; } else { my $i = $start; return sub { return undef if $i > $end; $_[0] = $i++; return 1; }; } } if (defined($_[0])) { ++$_[0]; } else { $_[0] = $start; } if ($_[0] > $end) { return $_[0] = undef; } else { return 1; } }