Как я могу объединить два списка, используя карту? - PullRequest
2 голосов
/ 14 апреля 2011

У меня есть такой код в Perl:

#!/usr/bin/perl -w

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

Я хочу видеть в результате это: @c = ('one1', 'two2', 'three3'); Есть ли способ объединить эти списки в один?

Ответы [ 3 ]

9 голосов
/ 14 апреля 2011

Предполагая, что вы можете гарантировать, что два массива всегда будут одинаковой длины.

my @c = map { "$a[$_]$b[$_]" } 0 .. $#a;
6 голосов
/ 14 апреля 2011

В качестве альтернативы вы можете использовать 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;
};
1 голос
/ 14 апреля 2011

Для полноты и чтобы Том был счастлив, вот чистая реализация на Perl pairwise, которую вы можете использовать:

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, как показывает Даворг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...