1

@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'];

次に、次のようにしたいと思い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'
)

(または、returnarrayrefs: の配列にすることもできます(['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]最初の 2 項の連結をに格納し、$combos[2]最初の 3 項の連結を に格納$combos[3]します。

于 2015-07-27T19:09:11.007 に答える