Voglio unire due array di uguale lunghezza in un singolo array prendendo il primo elemento dall'array A, il primo elemento dall'array B; secondo elemento da A, secondo elemento da B, ecc Il seguente programma illustra l'algoritmo:Perl - funzione integrata per "zippare" insieme due array?
# file zipper.pl
use strict;
use warnings;
use 5.010;
my @keys = qw/abel baker charlie dog easy fox/;
my @values = qw/a b c d e f/;
# ==> Is there a builtin function that is equivalent of zipper()? <==
#
my %hash = zipper(\@keys, \@values);
while (my ($k, $v) = each %hash) {
say "$k=$v";
}
# zipper(): Take two equal-length arrays and merge them (one from A, one from B,
# another from A, another from B, etc.) into a single array.
#
sub zipper {
my $k_ref = shift;
my $v_ref = shift;
die "Arrays must be equal length" if @$k_ref != @$v_ref;
my $i = 0;
return map { $k_ref->[ $i++ ], $_ } @$v_ref;
}
uscita
$ ./zipper.pl
easy=e
dog=d
fox=f
charlie=c
baker=b
abel=a
mi chiedo se ho trascurato una funzione built-in Perl che fai l'equivalente di zipper(). Sarà nel ciclo più interno del programma e dovrà essere eseguito il più velocemente possibile. Se non c'è un modulo built-in o CPAN, qualcuno può migliorare la mia implementazione?
Davvero molto bello. E come al solito, invece di porre la vera domanda, ho assunto una soluzione e poi ho formulato la domanda in questo modo. La tua soluzione è senza dubbio il modo migliore per andare. Ulteriori rivelazioni: sto effettivamente cercando di inizializzare un Tie :: IxHash - Ho usato il modulo OO, e non credo che supporti la slice hash, ma per i miei scopi penso che la semplice interfaccia non-OO sarebbe Stammi bene. – Chap
Devo anche dire, so che molte persone non amano il modo in cui i sigilli cambiano in Perl, ma penso che in questo caso aiuti davvero ad ispezionare visivamente ciò che sta accadendo. Forse è solo io :-) –