如何使用地图连接两个列表?
我有这样的代码在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