1

我有一个未知大小的数组@ary。每个元素 ,$ary[$i]是一个未知大小的数组引用。, ,的每个元素$ary[$i][$j]都是一个字符串。

我希望将所有的$ary[0][$j]与所有的$ary[1][$j]与所有的……等连接起来。

也就是说,假设我的数组如下所示:

$ary[0] = ['foo', 'fun'];
$ary[1] = ['bar', 'bun', 'blip'];
$ary[2] = ['baz', 'zun'];

然后我希望return成为:

(
'foo bar baz',
'foo bar zun',
'foo bun baz',
'foo bun zun',
'foo blip baz',
'foo blip zun',
'fun bar baz',
'fun bar zun',
'fun bun baz',
'fun bun zun',
'fun blip baz',
'fun blip zun'
)

(或者,return可以是 arrayrefs 的数组:(['foo', 'bar', 'baz'], ['foo', 'bar', 'zun'], …)。)

我怎样才能做到这一点?

4

2 回答 2

3

我建议从一组索引开始,然后遍历所有组合:

#!/usr/bin/env perl

use strict;
use warnings;
use feature qw(say);

my @array = (
    [qw(foo fun)],
    [qw(bar bun blip)],
    [qw(baz zun)],
);

my @index = (0) x @array;

SET:
while (1) {
    my @set = map { $array[$_][ $index[$_] ] } (0 .. $#index);

    say "@set";

    $index[-1]++;

    for my $i (reverse 0 .. $#index) {
        if ($index[$i] > $#{ $array[$i] }) {
            $index[$i] = 0;
            if ($i > 0) {
                $index[$i - 1]++;
            } else {
                last SET;
            }
        }
    }
}

结果:

foo bar baz
foo bar zun
foo bun baz
foo bun zun
foo blip baz
foo blip zun
fun bar baz
fun bar zun
fun bun baz
fun bun zun
fun blip baz
fun blip zun

有 cpan 模块可以进行这种类型的组合,但不知道它们。

于 2015-07-27T18:42:09.307 回答
1

我这样做了,它奏效了:

#!/usr/bin/perl
use strict;
use warnings;

my @arry= ();
$arry[0] = ['foo', 'fun'];
$arry[1] = ['bar', 'bun', 'blip'];
$arry[2] = ['baz', 'zun'];

my @combos = ();
$combos[0] = [''];

for my $i (1 .. @arry) {
  for my $j (0 .. @{$combos[$i - 1]} - 1) {
    push @{$combos[$i]}, "$combos[$i - 1][$j] $_" for @{$arry[$i - 1]};
  }
}
my @goodcombos = @{$combos[-1]};
s/^ // for @goodcombos;
print "$_\n" for @goodcombos;

它构建了所需的串联,将第一个术语存储在 中$combos[1],前两个术语的串联存储在 中$combos[2],前三个术语的串联存储在 中$combos[3],依此类推。

于 2015-07-27T19:09:11.007 回答