2013-04-15 12 views
6

użyłemPerl sposób iteracji ponad 2 tablic równolegle

Use List::MoreUtils qw(each_array); 
my $it = each_array(@input_dump_arr, @created_dump_arr); 
while (my ($first, $second) = $it->()) { 
} 

to będzie działać w domyślnej konfiguracji Perl? Szersze pytanie brzmi: czy istnieją wytyczne dotyczące pisania "przenośnych" skryptów perl? Jestem nowicjuszem w Perl, próbując po prostu dowiedzieć się, czy cpan jest w rzeczywistości analogiczny do tego, jak doładować biblioteki do C++.

Odpowiedz

4

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.

2

Istnieją moduły dystrybuowane bezpośrednio z samym Perlem. Nazywa się je zwykle "modułami podstawowymi". Zawsze możesz z nich korzystać. List::Util jest jednym z nich, choć nie jest to List::MoreUtils. Jest to moduł dostępny pod numerem CPAN. CPAN jest często uważany za "standardową bibliotekę Perla", podobnie jak "standardowa biblioteka" dla C++. Większość ludzi uważa, że ​​można wymagać, aby użytkownicy ich aplikacji mieli zainstalowane pewne moduły z CPAN, zwłaszcza jeśli są to dobrze używane moduły.

List::MoreUtils to zdecydowanie dobrze wykorzystany moduł. Jest już od jakiegoś czasu. Wszystkie główne dystrybucje Linuksa, które znam, zawierają wersje paczkowane.

Więc jeśli twoim celem nie jest całkowite uniezależnienie się od modułów innych niż podstawowe, zdecydowanie sugeruję, abyś kontynuował używanie List::MoreUtils i większości innych dostępnych w CPAN modułów. To dlatego Perl kołysze.

Nieco offtopic: Muszę przyznać, że wolę pairwise (także od List::MoreUtils) dla dokładnie dwóch tablic, ponieważ zachowuje się bardziej jak map. Na swoim przykładzie:

use List::MoreUtils qw(pairwise); 
pairwise { do_stuff($a, $b) } @input_dump_arr, @created_dump_arr; 
+2

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

+0

Wow, dziękuję mob, Perl rośnie na mnie: D – subramanian

+1

... jeśli twój kod jest rozpowszechniany za pomocą zgodnej licencji. – ikegami

5

To nie jest moduł podstawowy (co oznacza, że ​​nie jest w zestawie z Perl), ale jest to stosunkowo często jeden. Nie wahałbym się z niego korzystać.

Jeśli naprawdę paranoję może nie być dostępna, zakładając tablice są sam rozmiar, można użyć coś jak poniżej:

for my $i (0 .. $#array1) { 
    my $first = $array1[$i]; 
    my $second = $array2[$i]; 
} 

Jednak, na szczęście each_array() jest realizowany w czysty perl, więc możesz również wyświetlić źródło List/MoreUtils.pm i skopiować i wkleić odpowiednie podprogramy.

Powiązane problemy