use Iterator; sub irange_limited { my ($start, $end) = @_; return Iterator->new ( sub { Iterator::is_done() if $start > $end; return $start++; } ); } my $it = irange_limited(3, 5); foreach ( $it->value ) {say $_ }