16

假设我有 2 个数组,如下所述

@a1 = ("Vinay", Raj, harry);
@b1 = ("dude","rock");

合并后我想要这样的结果

[
    Vinay
    dude
    Vinay
    rock
    Raj
    dude
    Raj
    rock
    harry
    dude
    harry
    rock
]

基本上我想将array1的每个索引值合并到array2的所有索引值。

除了上述问题,我还有另一个问题。

对于上述相同的问题,如何在特定数组索引处合并 2 个数组。例如,我有 2 个每个 160 个元素的数组,现在我想在集合中的每个第 5 个元素处合并数组,这可能吗?

4

6 回答 6

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);
于 2012-10-28T06:33:01.663 回答
10

这是一种方法。不过,可能不是最好的 perl 语法。双 for 循环意味着您将把两个数组的每个组合推入合并数组。我已尝试对其进行设置,以使结果符合您在问题中指定的顺序。

my @merged;

for my $a ( @a1 ) {
  for my $b ( @b1 ) {
    push( @merged, ($a, $b) );
  }
}
于 2012-10-28T06:34:38.000 回答
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'
        ]
于 2012-10-28T06:53:35.730 回答
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);

如何按规定“合并”这些?一种方法是使用一对嵌套循环。更简洁地说,使用 amap的 a map

my @merged = map {my $outer = $_; map {($outer, $_)} @b1} @a1;

您不需要 perl 5.12 的任何特殊功能。只需利用列表崩溃的事实。

于 2012-10-28T13:10:06.873 回答
1

它可以在一行中完成:

@merged = grep {not ref} map {[our $t = $_], map {$t,$_} @b1} @a1;

并且在内部推动时不那么残酷

map {our $t = $_, map {push(@merged, $t, $_)} @b1} @a1;
于 2012-10-28T09:08:00.323 回答
0

Set::CrossProduct从 CPAN使用。

zipfrom List::MoreUtils 在其参数列表的相应(而不是 cross)索引处压缩元素

于 2012-10-28T10:32:29.897 回答