my @aoa1 = ( [ 'a', 'b', 'c' ], [ 'd', 'e', '' ], [ 'f', 'g', '' ], [ 'h', '', '' ] ); sub combinations { return if ! @_; my @array = grep { $_ ne '' } @{shift()}; my @subs = combinations( @_ ); if ( ! @subs ) { return map { [ $_ ] } @array; } my @out; foreach my $item ( @array ) { foreach my $sub ( @subs ) { push @out, [ $item, @$sub ]; } } return @out; } my @aoa2 = combinations( @aoa1 );