2013-12-16 65 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