假设我有2个如下所述的数组
@a1 = ("Vinay", Raj, harry);
@b1 = ("dude","rock");
合并后我想得到像这样的结果
[
Vinay
dude
Vinay
rock
Raj
dude
Raj
rock
harry
dude
harry
rock
]
基本上我想将array1的每个索引值合并到array2的所有索引值。
除了上述问题,我还有另一个问题。
对于上面的相同问题,如何在特定数组索引处合并2个数组。例如,我有160个元素的2个数组,现在我想在集合中的每个第5个元素合并数组,这可能吗?
答案 0 :(得分:53)
只需制作一个新阵列:
my @merged = (@a1, @b1);
这是一个完整的例子:
my @a1 = ("foo", "bar");
my @a2 = ("baz", "spam");
my @merged = (@a1, @a2);
print $merged[3]; #=> "spam"
编辑:我错过了订购要求。您只需zip
将它们放在一起,您就可以使用List::MoreUtils
:
use List::MoreUtils qw(zip);
use Data::Dumper qw(Dumper);
my @a1 = ("Vinay", "Raj", "harry");
my @a2 = ("dude", "rock");
my @merged = zip(@a1, @a2);
print Dumper(\@merged);
答案 1 :(得分:10)
这是一种方法。但是,它可能不是最好的perl语法。 double for循环意味着您将把两个数组的每个组合推送到合并数组中。我试图设置它,以便结果按照你在问题中指定的顺序。
my @merged;
for my $a ( @a1 ) {
for my $b ( @b1 ) {
push( @merged, ($a, $b) );
}
}
答案 2 :(得分:4)
这是另一种选择:
use strict;
use warnings;
use Data::Dumper;
my $a = join ',', qw/Vinay Raj harry/;
my $b = join ',', qw/dude rock/;
my @merged = map { split '-' } glob "{$a}-{$b}";
print Dumper \@merged;
输出:
$VAR1 = [
'Vinay',
'dude',
'Vinay',
'rock',
'Raj',
'dude',
'Raj',
'rock',
'harry',
'dude',
'harry',
'rock'
]
答案 3 :(得分:4)
首先,不要使用裸字,并且如jmdeldin的评论中所述,始终将use strict; use warnings;
放在脚本的开头。
那么如何制作这些列表@a1
和@b1
?使用引号:
my @a1 = ('Vinay', 'Raj', 'harry');
my @a2 = ('dude', 'rock');
或使用qw
:
my @a1 = qw(Vinay Raj harry);
my @a2 = qw(dude rock);
如何按指定“合并”这些?一种方法是使用一对嵌套循环。更加简洁,使用map
的{{1}}:
map
您不需要perl 5.12的任何特殊功能。只是利用列表崩溃的事实。
答案 4 :(得分:1)
这可能是在一行中非常糟糕地完成的:
@merged = grep {not ref} map {[our $t = $_], map {$t,$_} @b1} @a1;
并且内部推进不那么恶劣
map {our $t = $_, map {push(@merged, $t, $_)} @b1} @a1;
答案 5 :(得分:0)
使用CPAN中的Set::CrossProduct
。
List :: MoreUtils中的zip
在其参数列表的对应(而非交叉)索引处拉链元素。