2014-11-18 17 views
6

Esiste un modo semplice per confrontare due array di stringhe in Perl?Confronta due array in modo semplice usando Perl

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

Ho bisogno del confronto come qui di seguito per "N" Numero di valori,

value1 eq value1 
value2 eq value3 
value3 eq value4 

Si prega di suggerire me non v'è alcun modulo per fare questo?

Grazie

risposta

7

Hmm ... un modu le per confrontare gli array, tu dici. Che ne pensi di 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"; 
} 

Ma è anche possibile utilizzare l'operatore smart match.

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

Perl ha già alcune parti per una soluzione a tutte le operazioni di lista.

Vedere List::Util e List::MoreUtils.

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

Per questa applicazione, vedere List::Util::pairfirst e List::MoreUtils::zip

+1

Anche se questo frammento di codice potrebbe risolvere la questione, [tra cui una spiegazione] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) aiuta veramente a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. – msrd0

1

Questo compito è abbastanza semplice che non avrei necessariamente desidera utilizzare un modulo CPAN. Invece, probabilmente scriverò la mia subroutine di confronto e la inserirò nel mio modulo di utilità. Ecco un'implementazione che confronterà due array contenenti stringhe e/o interi.

#!/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

È possibile confrontare le dimensioni di entrambe le matrici (@a1 == @a2 nel contesto scalare), e poi confronta dimensione @a1 matrice con la dimensione della lista di indici corrispondenti alle pari stringhe in entrambe le matrici (grep $a1[$_] eq $a2[$_], 0..$#a1),

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

Maggiori prestazioni versione oriented (non passare attraverso tutti gli elementi, se non necessario),

use List::Util 'all'; 

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

Non mi è piaciuta la tua prima soluzione perché confrontava tutti gli elementi di entrambi gli array, ma hai risolto il problema con la tua seconda soluzione, quindi questa risposta ottiene il mio voto come il migliore finora. –