sub comb { my @idx = map { 0 } @_; my @max = map { $#$_ } @_; my @rv; for (;;) { push(@rv, [ map { $_[$_][$idx[$_]] } 0..$#idx ]); my $i = 0; for (;;) { $idx[$i]++; last if $idx[$i] <= $max[$i]; $idx[$i] = 0; $i++; return \@rv if $i == @idx; } } }