È possibile utilizzare questa riscrittura più semplice della funzione each_arrayref
del modulo. each_array
è un involucro superfluo attorno a questa funzione che utilizza i prototipi per prendere i riferimenti agli array passati come parametri.
La sua funzionalità è identica alla versione del modulo, con la differenza che non esegue il controllo dei parametri che riceve e l'iteratore restituito non controlla che non abbia né parametri né 'index'
.
use strict;
use warnings;
sub each_array {
my @copy = @_;
my $i;
my $max;
for (map scalar @$_, @copy) {
$max = $_ unless defined $max and $max > $_;
}
sub {
return $i if @_ and shift eq 'index';
my $new_i = defined $i ? $i + 1 : 0;
return if $new_i >= $max;
$i = $new_i;
return map $_->[$i], @copy;
}
}
my @array1 = qw/ A B C /;
my @array2 = qw/ D E F G /;
my $iter = each_array(\@array1, \@array2);
while (my @values = $iter->()) {
printf "%d: %s\n", $iter->('index'), join ', ', map $_ // 'undef', @values;
}
uscita
0: A, D
1: B, E
2: C, F
3: undef, G
Si potrebbe, naturalmente, semplicemente prendere il codice per each_arrayref
dal modulo List::MoreUtils
. È autonomo e garantisce la compatibilità con il codice esistente.
E se non si desidera richiedere 'List :: MoreUtils', si può ancora solo [copiare le parti che ti piacciono] (http://cpansearch.perl.org/src/RURBAN/List-MoreUtils-0.33 _007/lib/List/MoreUtils.pm) nella tua applicazione. – mob
Wow grazie mob, Perl sta crescendo su di me: D – subramanian
... se il codice viene distribuito con una licenza compatibile. – ikegami