2011-04-14 81 views
2

我有这样的代码在Perl:如何使用地图连接两个列表?

#!/usr/bin/perl -w 

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

我想在这个结果看:@c = ('one1', 'two2', 'three3'); 有没有方法可以让我这些列表合并成一个?

回答

9

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

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

非常感谢! – vandie 2011-04-14 12:11:08

6

作为替代方案,可以使用pairwiseList::MoreUtils

#!/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; 
}; 
+0

不需要声明'$ a'和'$ b' - 无论如何,无论如何,您都将它们声明在全局范围内。即使本地化它们也没有多大意义。 – Axeman 2011-04-14 12:41:42

+0

_ [Axeman](http://stackoverflow.com/users/11289/axeman)_:要压制警告,您必须声明它们,或者禁用'once'警告。 – 2011-04-14 12:44:47

+0

@Alan Haggai Alavi:我明白了。我想在一个标准的脚本中,我使用了足够的排序,我从来没有遇到过。无论如何,没有理由在“do”结构中伪造本地化。在'做'这个事情中'一次'没有警告'更有意义。 – Axeman 2011-04-14 12:54:41

1

为了完整,并让汤姆开心,这里是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展示可能更容易。