Możesz użyć tej prostszej przeróbki funkcji modułu each_arrayref
. each_array
to zbyteczna otoczka wokół tej funkcji, która używa prototypów do odwoływania się do tablic przekazywanych jako parametry.
Jego funkcjonalność jest identyczna z wersją modułu, z tą różnicą, że nie sprawdza parametrów, które otrzymuje, a powrócony iterator nie sprawdza, czy nie ma on żadnych parametrów lub '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;
}
wyjście
0: A, D
1: B, E
2: C, F
3: undef, G
Możesz, oczywiście, po prostu wziąć kod each_arrayref
z modułu List::MoreUtils
. Jest samodzielny i gwarantuje zgodność z istniejącym kodem.
A jeśli nie chcesz, aby 'List :: MoreUtils', nadal możesz po prostu kopiować części, które lubisz (http://cpansearch.perl.org/src/RURBAN/List-MoreUtils-0.33 _007/lib/List/MoreUtils.pm) do swojej aplikacji. – mob
Wow, dziękuję mob, Perl rośnie na mnie: D – subramanian
... jeśli twój kod jest rozpowszechniany za pomocą zgodnej licencji. – ikegami