2014-11-18 15 views
6

Gibt es eine einfache Möglichkeit, zwei String-Arrays in Perl zu vergleichen?Vergleichen Sie zwei Arrays auf einfache Weise mit Perl

@array1 = (value1, value2, value3...); 
@array2 = (value1, value3, value4...); 

Ich brauche den Vergleich wie unten für „N“ Anzahl der Werte,

value1 eq value1 
value2 eq value3 
value3 eq value4 

Bitte empfehlen Sie mir ist es ein Modul, dies zu tun?

Dank

Antwort

7

Hmm ... ein modu le, um Arrays zu vergleichen, sagst du. Wie wäre es mit Array::Compare?

use Array::Compare; 

my $compare = Array::Compare->new; 

my @array1 = (value1, value2, value3...); 
my @array2 = (value1, value3, value4...); 

if ($compare->compare(\@array1, \@array2) { 
    say "Arrays are the same"; 
} else { 
    say "Arrays are different"; 
} 

Sie können aber auch den Smart-Match-Operator verwenden.

if (@array1 ~~ @array2) { 
    say "Arrays are the same"; 
} else { 
    say "Arrays are different"; 
} 
3

Perl hat bereits einige Teile für eine Lösung auf alle Listenoperationen.

Siehe List::Util und List::MoreUtils.

my $arrays_are_equal 
    = !List::Util::pairfirst { $a ne $b }  # first case where $a != $b 
     List::MoreUtils::zip(@array1, @array2) 
    ; 

Für diese Anwendung finden List::Util::pairfirst und List::MoreUtils::zip

+1

Während dieser Code-Schnipsel, die Frage lösen kann, [einschließlich einer Erklärung] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) hilft wirklich, die zur Verbesserung der Qualität Ihres Beitrags. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. – msrd0

1

Diese Aufgabe einfach genug ist, dass ich nicht unbedingt ein CPAN-Modul verwenden möchte. Stattdessen würde ich wahrscheinlich meine eigene Vergleichsunterroutine schreiben und sie in mein eigenes Dienstprogrammmodul einfügen. Hier ist eine Implementierung, die zwei Arrays vergleicht, die Strings und/oder Ganzzahlen enthalten.

#!/usr/bin/env perl 

use strict; 
use warnings; 

my @array1 = (1..10, 'string'); 
my @array2 = (1..10, 'string'); 

my $is_same = is_same(\@array1, \@array2); 

print "is_same: $is_same\n"; 

sub is_same { 
    my($array1, $array2) = @_; 

    # immediately return false if the two arrays are not the same length 
    return 0 if scalar(@$array1) != scalar(@$array2); 

    # turn off warning about comparing uninitialized (undef) string values 
    # (limited in scope to just this sub) 
    no warnings; 

    for (my $i = 0; $i <= $#$array1; $i++) { 
    if ($array1->[$i] ne $array2->[$i]) { 
     return 0; 
    } 
    } 

    return 1; 
} 
3

Sie können Größen von beiden Arrays vergleichen (@a1 == @a2 in Skalarkontext) und dann zu vergleichen, eine Größe von @a1 Array mit der Größe der Liste von Indizes, die gleich Strings in beiden Arrays (grep $a1[$_] eq $a2[$_], 0..$#a1) entspricht,

if (@a1 == @a2 and @a1 == grep $a1[$_] eq $a2[$_], 0..$#a1) { print "equal arrays\n" } 

Mehr Leistung orientierte Version (geht nicht durch alle Elemente, wenn nicht notwendig),

use List::Util 'all'; 

if (@a1 == @a2 and all{ $a1[$_] eq $a2[$_] } 0..$#a1) { print "equal arrays\n" } 
+1

Ich mochte Ihre erste Lösung nicht, weil sie jedes Element in beiden Arrays verglichen hat, aber Sie haben dieses Problem mit Ihrer zweiten Lösung gelöst, so dass diese Antwort meine Stimme als beste bisher erhält. –