如何使用地图加入两个列表?

时间:2011-04-14 11:46:40

标签: perl list map merge

我在Perl中有这样的代码:

#!/usr/bin/perl -w

my @a = ('one', 'two', 'three');
my @b = (1, 2, 3);

我希望看到结果:@c = ('one1', 'two2', 'three3'); 有没有办法将这些列表合并为一个?

3 个答案:

答案 0 :(得分:9)

假设您可以保证两个数组的长度始终相同。

my @c = map { "$a[$_]$b[$_]" } 0 .. $#a;

答案 1 :(得分:6)

作为替代方案,您可以使用List::MoreUtils中的pairwise

#!/usr/bin/env perl

use strict;
use warnings;

use List::MoreUtils qw( pairwise );

my @a = ( 'one', 'two', 'three' );
my @b = ( 1,     2,     3 );

my @c = do {
    no warnings 'once';
    pairwise { "$a$b" } @a, @b;
};

答案 2 :(得分:1)

为了完整性,为了让Tom高兴,这里有一个pairwise的纯perl实现,你可以使用:

use B ();
use List::Util 'min';

sub pairwise (&\@\@) {
    my ($code, $xs, $ys) = @_;
    my ($a, $b) = do {
        my $caller = B::svref_2object($code)->STASH->NAME;
        no strict 'refs';
        map \*{$caller.'::'.$_} => qw(a b);
    };

    map {
        local *$a = \$$xs[$_];
        local *$b = \$$ys[$_];
        $code->()
    } 0 .. min $#$xs, $#$ys
}

由于涉及到这一点,因此可能更容易使用map作为davorg节目。