Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 连接数组的数组_Arrays_Perl_Arrayref - Fatal编程技术网

Arrays 连接数组的数组

Arrays 连接数组的数组,arrays,perl,arrayref,Arrays,Perl,Arrayref,我有一个大小未知的数组@ary。每个元素,$ary[$i]是一个大小未知的arrayref。其中,$ary[$i][$j]的每个元素都是一个字符串 我希望将所有的$ary[0][$j]与所有的$ary[1][$j]连接起来,然后依次类推 也就是说,假设我的数组如下所示: $ary[0] = ['foo', 'fun']; $ary[1] = ['bar', 'bun', 'blip']; $ary[2] = ['baz', 'zun']; 那么我希望回报是: 或者,返回可以是arrayrefs

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

我希望将所有的$ary[0][$j]与所有的$ary[1][$j]连接起来,然后依次类推

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

$ary[0] = ['foo', 'fun'];
$ary[1] = ['bar', 'bun', 'blip'];
$ary[2] = ['baz', 'zun'];
那么我希望回报是:

或者,返回可以是arrayrefs的数组:['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/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]中,将前两个术语的连接存储在$combos[2]中,将前三个术语的连接存储在$combos[3]中,依此类推。

#!/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]中的前2个术语的连接、$combos[3]中的前3个术语的连接,等等。

但我怀疑对于大型数组,它比我的好。他的循环使用两个,而我的循环使用三个。我的内存中有很多东西是他的内存没有的,但我怀疑对于大型阵列来说,它比我的要好。他的循环使用两个,而我的循环使用三个。我的记忆中有很多东西是他的记忆中没有的。