我在Perl中有这样的代码:
#!/usr/bin/perl -w
my @a = ('one', 'two', 'three');
my @b = (1, 2, 3);
我希望看到结果:@c = ('one1', 'two2', 'three3');
有没有办法将这些列表合并为一个?
答案 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节目。