2013-09-30 2 views
2

У меня есть массив массивов.Получить все комбинации из N массивов

@a=([1,2,3],['b','r','g'],['L','X']); 

И хочет иметь этот результат:

@b=(
[1,'b','L'],[1,'b','X'], 
[1,'r','L'],[1,'r','X'], 
[1,'g','L'],[1,'g','X'], 

[2,'b','L'],[2,'b','X'], 
[2,'r','L'],[2,'r','X'], 
[2,'g','L'],[2,'g','X'], 

[3,'b','L'],[3,'b','X'], 
[3,'r','L'],[3,'r','X'], 
[3,'g','L'],[3,'g','X'], 
) 

Мой входной массив @a имеет от 2 до 6 вложенных массивов

не знают, как найти эту функцию на CPAN.

+1

Использование http://search.cpan.org/perldoc?Math%3A%3ACombinatorics – Jean

+0

Да, я видел. Но его не объединяет, не переставляет, не держит. И это все из этой библиотеки. –

+0

Существует также [Set :: CrossProduct] (http://search.cpan.org/~bdfoy/Set-CrossProduct-1.95/lib/Set/CrossProduct.pm) –

ответ

5
use Algorithm::Loops qw(NestedLoops); 
my @b; NestedLoops(\@a, sub { push @b, [ @_ ] }); 
+0

Да, спасибо! –

1

Почему cpan?

use strict; use warnings; 
use Data::Dumper; 
my @a=([1,2,3],['b','r','g'],['L','X']); 

my @b; 
foreach my $i (@{$a[0]}){ 
    foreach my $c (@{$a[1]}){ 
     foreach my $k (@{$a[2]}){ 
      push @b, [$i, $c, $k]; 
     } 
    } 
} 

print Dumper(\@b); 
+0

Его не всегда 3 измерения. У меня есть @a как вход, и у него есть от 2 до 6 массивов внутри. –

+5

и вот почему cpan – mob

Смежные вопросы