sub foo { # ... return wantarray? @foo : \@foo; } #### sub foo { # ... return wantarray? @foo : sub { shift @foo if @foo }; } #### my @array = foo( $x ); foreach ( @array ) { # do something } #### my $iter = foo( $x ); while ( my $row = $iter->() ) { # do something }