2013-08-26 45 views
1

我想在同一個元素上將兩個數組連接在一起。例如,我想結合$ array1 [0]和$ array2 [0]等等。試圖使用Perl加入每個元素的兩個陣列

@array1 = qw(A B C D) 
@array2 = qw(a b c d) 

@array3 = qw(A a B b C c D d) 

我以前試過使用嵌入式循環,但那只是產生了錯誤的輸出。

foreach my $liginfo_data_var (@liginfo_data) 
{ 
    foreach my $ligands_data_var (@ligands_data) 
    { 
     print COMBLIG join ($liginfo_data_var, "\t", $ligands_data_var, "\n"); 

    } 
} 

我還沒有找到StackOverflow上的答案,並希望聽到一些建議。非常感謝!

+1

可能重複(http://stackoverflow.com/questions/16755642/perl-built-在功能上拉鍊在一起兩陣列) – squiguy

回答

7

(啊哈,多麼容易這將是Perl6:@array3 = @array1 Z @array2

不要遍歷元素直接。相反,環比指數兩個數組的並行:

for my $i (0 .. $#array1) { 
    push @array3, $array1[$i], $array2[$i]; 
} 

或者與map@array3 = map { $array1[$_], $array2[$_] } 0 .. $#array1

如果兩個輸入數組具有相同的長度,則可以正常工作。您也可以use List::MoreUtils 'zip'@array3 = zip @array1, @array2

但似乎你不想創建一個@array3。如果你只是想打印出兩個元素:

for my $i (0 .. $#array1) { 
    say COMBLIG $array1[$i], "\t", $array2[$i]; 
} 

請注意,我沒有使用join。該函數將輸入列表與特定分隔符連接起來,該分隔符作爲第一個參數給出。例如。 join ', ', 1..3產生"1, 2, 3"

+0

工作就像一個魅力!我結束了使用你最後的建議。謝謝一堆! – Wally

2

下面是一個例子直出的文檔爲List::MoreUtils

use List::MoreUtils 'pairwise'; 

@a = qw/a b c/; 
@b = qw/1 2 3/; 
@x = pairwise { ($a, $b) } @a, @b; # returns a, 1, b, 2, c, 3 

編輯:作爲池上指出,zip是一個更好的解決方案:

use List::MoreUtils 'zip'; 

@a = qw/a b c/; 
@b = qw/1 2 3/; 
@x = zip @a, @b; # returns a, 1, b, 2, c, 3 

我跑了基準比較zippairwise和amon的map解決方案,所有這些都返回一個新的數組。 pairwise是雙手向下失敗者:[?Perl的 - 內置的功能爲「拉鍊」在一起的兩個陣列]的

   Rate pairwise  map  zip 
pairwise 111982/s  --  -43%  -52% 
map  196850/s  76%  --  -16% 
zip  235294/s  110%  20%  -- 
+0

@ikegami是的,剛剛發現了'zip'感謝@ amon的回答以及評論中關聯的答案@squiguy。在這種情況下,不僅「zip」更容易閱讀,而且速度也更快。謝謝你的提示。 – ThisSuitIsBlackNot