2011-04-14 3 views

Répondre

9

En supposant que vous pouvez garantir les deux tableaux seront toujours la même longueur.

my @c = map { "$a[$_]$b[$_]" } 0 .. $#a; 
+0

Merci beaucoup! – vandie

6

Comme alternative, vous pouvez utiliser pairwise de 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; 
}; 
+0

Vous n'avez pas besoin de déclarer '$ et de a'' b' de $ - quel que soit, vous les déclarer à une portée globale de toute façon. Même les localiser n'a pas beaucoup de sens. – Axeman

+0

_ [Axeman] (http://stackoverflow.com/users/11289/axeman) _: Pour supprimer les avertissements, vous devez les déclarer ou désactiver les avertissements 'Once '. –

+0

@Alan Haggai Alavi: Je vois. Je suppose que dans un script standard j'utilise assez de tri que je ne rencontre jamais ça. Quoi qu'il en soit, il n'y a aucune raison de le pseudo-localiser dans une construction 'do'. Il est plus logique de ne faire aucune «alerte» une fois dans ce «faire». – Axeman

1

Pour être complet, et de rendre Tom heureux, voici une implémentation perl pure de pairwise que vous pouvez utiliser:

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 
} 

Depuis est un peu en cause, il est probablement plus facile d'utiliser simplement map comme davorg montre.

Questions connexes