sub make_iter_deeper { my @AoA = @_; my @idx; my $i = 0; # keeping it simple $idx[0] = -1; # same as $idx = -1 above; my @return; return sub { # if the index of the array i'm working in is # past the end of elements if ( ++$idx[$i] > $#{@{$AoA[$i]}} ) { return; } # if not, put the next element in the return value else { $return[$i] = $AoA[$i][$idx[$i]] } return @return; } } my $iter = make_iter_deeper([3,4,6,7]); print join(',',@_) . "\n" while( @_ = $iter->() );