sub make_iter { my @values = @_; my $idx = -1; return sub { # check if we are out of values, # return a value or undef if we're out return (++$idx > $#values) ? undef : $values[$idx]; } } my $iter = make_iter(3,4,6,7); print while( $_ = $iter->() );