1

我想在同一个元素处将两个数组连接在一起。例如,我想结合 $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 上找到答案,希望能听到一些建议。非常感谢!

4

2 回答 2

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".

于 2013-08-26T17:43:32.020 回答
2

Here's an example straight out of the documentation for 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

EDIT: As ikegami pointed out, zip is a better solution:

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

I ran a benchmark comparing zip, pairwise, and amon's map solution, all of which return a new array. pairwise was the hands-down loser:

             Rate pairwise      map      zip
pairwise 111982/s       --     -43%     -52%
map      196850/s      76%       --     -16%
zip      235294/s     110%      20%       --
于 2013-08-26T17:46:58.530 回答