加入数组的数组
Joining an array of arrays
我有一个未知大小的数组 @ary
。每个元素 $ary[$i]
都是一个未知大小的数组引用。 that、$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
可以是数组引用数组:(['foo', 'bar', 'baz'], ['foo', 'bar', 'zun'], …)
。)
我该怎么做?
我建议从索引数组开始,然后遍历所有组合:
#!/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 模块可以进行这种类型的组合,但不了解它们。
我这样做了并且成功了:
#!/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]
中,将前 2 个术语的串联存储在 $combos[2]
中,将前 3 个术语的串联存储在 $combos[3]
中等等。
我有一个未知大小的数组 @ary
。每个元素 $ary[$i]
都是一个未知大小的数组引用。 that、$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
可以是数组引用数组:(['foo', 'bar', 'baz'], ['foo', 'bar', 'zun'], …)
。)
我该怎么做?
我建议从索引数组开始,然后遍历所有组合:
#!/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 模块可以进行这种类型的组合,但不了解它们。
我这样做了并且成功了:
#!/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]
中,将前 2 个术语的串联存储在 $combos[2]
中,将前 3 个术语的串联存储在 $combos[3]
中等等。