我想在同一元素中将两个数组连接在一起。例如,我想要结合$ 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上找到答案,希望听到一些建议。非常感谢!
答案 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
我运行了比较zip
,pairwise
和amon map
解决方案的基准测试,所有这些都返回了一个新数组。 pairwise
是失败的失败者:
Rate pairwise map zip
pairwise 111982/s -- -43% -52%
map 196850/s 76% -- -16%
zip 235294/s 110% 20% --