如何在perl中合并两个数组,交替每个数组的值

时间:2012-10-28 06:29:20

标签: arrays perl

假设我有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个元素合并数组,这可能吗?

6 个答案:

答案 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在其参数列表的对应(而非交叉)索引处拉链元素。