2013-12-16 101 views
0

我正尝试为使用用户输入文件生成的二维数组生成所有可能的组合。我需要用perl来获得这个。 例如:使用perl的未知二维数组的所有可能的阵列组合

假设从输入文件所形成的2D阵列是这样的 -

[a, b, c] 
[d, e] 
[f, g] 

此输入的预期输出是如下 -

[a, d, f] 
[a, d, g] 
[a, e, f] 
[a, e, g] 
[b, d, f] 
[b, d, g] 
[b, e, f] 
[b, e, g] 
[c, d, f] 
[c, d, g] 
[c, e, f] 
[c, e, g] 

自一个用户输入文件的数目行和列可以是任何东西,因此我无法使用固定数量的循环来创建这种组合。

+1

Stack Overflow是不是HW帮助网站。如果您有错误,请发布相关代码和错误消息。 – Noich

+0

您需要显示您遇到问题的代码并描述症状。 – Borodin

+0

@Borodin:但他/她不知道如何编写代码给定可变数量的输入。 – ysth

回答

0

以下是查看它的一种方法。如果你已经有一些数字阵列的结果和需要增加的额外一个,你会做这样的事情:

sub get_combinations { 
    my ($existing_results, $new_array) = @_; 
    my $new_results; 
    for my $existing_result (@$existing_results) { 
     for my $value (@$new_array) { 
      push @$new_results, [ @$existing_result, $value ]; 
     } 
    } 
    return $new_results; 
} 

现在,你可以简单地循环在你的二维数组:

​​
1

你想cartesian product

使用CPAN模块,

use Set::CrossProduct; 

my @arr = (
    [qw(a b c)], 
    [qw(d e)], 
    [qw(f g)], 
); 
my $iterator = Set::CrossProduct->new(\@arr); 

use Data::Dumper; 
print Dumper $iterator->combinations; 

use strict; 
use warnings; 

my @arr = (
    [qw(a b c)], 
    [qw(d e)], 
    [qw(f g)], 
); 

local $" = ", "; 
for my $aref (getCartesian(@arr)) { 
    print "[@$aref]\n"; 
} 

sub getCartesian { 
# 
    my @input = @_; 
    my @ret = map [$_], @{ shift @input }; 

    for my $a2 (@input) { 
    @ret = map { 
     my $v = $_; 
     map [@$v, $_], @$a2; 
    } 
    @ret; 
    } 
    return @ret; 
} 

输出

[a, d, f] 
[a, d, g] 
[a, e, f] 
[a, e, g] 
[b, d, f] 
[b, d, g] 
[b, e, f] 
[b, e, g] 
[c, d, f] 
[c, d, g] 
[c, e, f] 
[c, e, g] 
+0

我相信他现在会为他的硬件获得A +:] – nrathaus

+0

@nrathaus或许如果老师不要求解释? :) –

+1

实际上,我的大学老师用Google来查找是否有人复制,因为StackOverflow的排名很高......提示提示.. – nrathaus

1

这里的另一种选择:

use strict; 
use warnings; 
use v5.14; 

my @arr = ([qw(a b c)], [qw(d e)], [qw(f g)]); 

print "[$_]\n" for map s/-/, /gr, glob 
    join '-', map { '{' . (join ',', @$_) . '}' } @arr; 

输出:

[a, d, f] 
[a, d, g] 
[a, e, f] 
[a, e, g] 
[b, d, f] 
[b, d, g] 
[b, e, f] 
[b, e, g] 
[c, d, f] 
[c, d, g] 
[c, e, f] 
[c, e, g] 
+0

有趣的使用'glob',但是当元素长度超过一个字符时它有问题。 –

+0

@mpapec - 好 - 赶快 - 谢谢。固定。 “glob”在这项任务中表现良好。 – Kenosis