尝试使用Perl在每个元素处加入两个数组

时间:2013-08-26 17:35:09

标签: arrays perl join

我想在同一元素中将两个数组连接在一起。例如,我想要结合$ array1 [0]和$ array2 [0]等等。

@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上找到答案,希望听到一些建议。非常感谢!

2 个答案:

答案 0 :(得分:7)

(啊,这在Perl6中是多么容易:@array3 = @array1 Z @array2

不要直接迭代元素。相反,并行循环遍历两个数组的 indices

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"

答案 1 :(得分: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是失败的失败者:

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