2011-04-14 25 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展示可能更容易。