2013-08-26 46 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