2013-04-15 15 views
6

über 2 Arrays iterieren verwendet IPerl Art und Weise von parallel

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

Würde diese Arbeit in einer Standard-Perl-Konfiguration? Eine breitere Frage ist, gibt es Richtlinien, um "portable" Perl-Skripte zu schreiben? Ich bin neu in Perl und versuche nur herauszufinden, ob cpan tatsächlich analog zu Boost-Bibliotheken zu C++ ist.

Antwort

4

Sie können dieses einfachere Umschreiben der Funktion each_arrayref des Moduls verwenden. each_array ist ein überflüssiger Wrapper um diese Funktion, der Prototypen verwendet, um Referenzen auf Arrays zu nehmen, die als Parameter übergeben werden.

Seine Funktionalität ist identisch mit der Modulversion, mit der Ausnahme, dass es keine Überprüfung der Parameter, die es empfängt, und der zurückgegebene Iterator überprüft nicht, ob es keine Parameter oder 'index' hat.

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; 
} 

Ausgang

0: A, D 
1: B, E 
2: C, F 
3: undef, G 

Man könnte sich natürlich für each_arrayref vom List::MoreUtils Modul den Code einfach nehmen. Es ist eigenständig und garantiert die Kompatibilität mit Ihrem bestehenden Code.

2

Es sind Module direkt mit Perl selbst verteilt. Sie werden normalerweise "Kernmodule" genannt. Sie können diese immer verwenden. List::Util ist einer von ihnen, obwohl List::MoreUtils nicht ist.

Jedoch ist List::MoreUtils ein Modul, das auf CPAN verfügbar ist. CPAN wird oft als "Perls Standardbibliothek" angesehen, ähnlich wie die "Standardbibliothek" für C++. Die meisten Leute denken, dass es in Ordnung ist, von Benutzern ihrer Anwendung zu verlangen, dass bestimmte Module von CPAN installiert werden, insbesondere wenn es sich um gut ausgelastete Module handelt.

List::MoreUtils ist definitiv ein gut verwendetes Modul. Es ist schon eine ganze Weile da. Alle wichtigen Linux-Distributionen, die ich kenne, enthalten gepackte Versionen davon.

Wenn Ihr Ziel nicht 100% unabhängig von Nicht-Kern-Modulen ist, dann empfehle ich dringend, dass Sie weiterhin List::MoreUtils und die meisten anderen feinen Module auf CPAN verwenden. Deshalb rockt Perl.

Leicht offtopic: Ich muss zugeben, dass ich pairwise (auch von List::MoreUtils) für genau zwei Arrays bevorzugen, weil es mehr wie map verhält. Für Ihr Beispiel:

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

Und wenn Sie 'List :: MoreUtils 'nicht benötigen, können Sie einfach nur [Teile kopieren] (http://cpansearch.perl.org/src/RURBAN/List-MoreUtils-0.33 _007/lib/List/MoreUtils.pm) in Ihre Anwendung. – mob

+0

Wow danke Mob, Perl wächst auf mich: D – subramanian

+1

... wenn dein Code mit einer kompatiblen Lizenz vertrieben wird. – ikegami

5

Es ist kein Kernmodul (es ist nicht mit Perl gebündelt Bedeutung), aber es ist ein relativ häufiger ein. Ich würde nicht zögern, es zu benutzen.

Wenn Sie wirklich paranoid es nicht verfügbar sein könnten, vorausgesetzt Arrays sind die gleiche Größe, Sie so etwas wie die folgenden verwenden:

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

jedoch zum Glück each_array() implementiert in pure perl, damit Sie auch die Quelle von List/MoreUtils.pm sehen und die relevanten Unterprogramme kopieren und einfügen können.

Verwandte Themen