我有這樣的代碼在Perl:如何使用地圖連接兩個列表?
#!/usr/bin/perl -w
my @a = ('one', 'two', 'three');
my @b = (1, 2, 3);
我想在這個結果看:@c = ('one1', 'two2', 'three3');
有沒有方法可以讓我這些列表合併成一個?
我有這樣的代碼在Perl:如何使用地圖連接兩個列表?
#!/usr/bin/perl -w
my @a = ('one', 'two', 'three');
my @b = (1, 2, 3);
我想在這個結果看:@c = ('one1', 'two2', 'three3');
有沒有方法可以讓我這些列表合併成一個?
假設您可以保證兩個數組的長度始終相同。
my @c = map { "$a[$_]$b[$_]" } 0 .. $#a;
作爲替代方案,可以使用pairwise
從List::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;
};
不需要聲明'$ a'和'$ b' - 無論如何,無論如何,您都將它們聲明在全局範圍內。即使本地化它們也沒有多大意義。 – Axeman 2011-04-14 12:41:42
_ [Axeman](http://stackoverflow.com/users/11289/axeman)_:要壓制警告,您必須聲明它們,或者禁用'once'警告。 – 2011-04-14 12:44:47
@Alan Haggai Alavi:我明白了。我想在一個標準的腳本中,我使用了足夠的排序,我從來沒有遇到過。無論如何,沒有理由在「do」結構中僞造本地化。在'做'這個事情中'一次'沒有警告'更有意義。 – Axeman 2011-04-14 12:54:41
爲了完整,並讓湯姆開心,這裏是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展示可能更容易。
非常感謝! – vandie 2011-04-14 12:11:08