Prima di tutto, dovrai riconsiderare la tua funzione.
identical(@a, @b);
non passa due array alla funzione, ma passa un singolo array con tutti gli elementi in entrambi gli array in esso. E 'come se lei ha detto:
identical(1, 2, 3, 2, 3, 1);
Affinché la funzione di lavorare, si dovrà passare references per gli array:
identical(\@a, \@b);
direi a prototype la subroutine, ma questo è probabilmente ti causerà more problems che risolverà.
Se l'ordine non è importante, ordinare gli array prima di confrontarli. Si potrebbe anche essere in grado di barare ...
sub identical {
my $array_ref_1 = shift;
my $array_fef_2 = shift;
use Digest::SHA qw(sha1_hex);
if (ref($array_ref_1) ne "ARRAY") or (ref($array_ref_2) ne "ARRAY") {
return; #Error, need two array references
}
# Dereference Arrays
my @array_1 = @{$array_ref_1};
my @array_2 = @{$array_ref_2};
# Setup Arrays to be one big scalar
my $scalar_1 = join "\n", sort @array_1;
my $scalar_2 = join "\n", sort @array_2;
my $checksum_1 = sha1_hex $scalar_1;
my $checksum_2 = sha1_hex $scalar_2;
if ($checksum_1 eq $checksum_2) {
return 1;
}
else {
return 0_but_true;
Alcune note:
- ho potuto avere dereferenziazioni, uniti, generate il checksum, e ha fatto il confronto in una singola istruzione. Li ho fatti separatamente per rendere più chiaro quello che stavo facendo. A livello di codice, probabilmente non fa alcuna differenza.Perl ottimizzerà comunque il tutto. Vado sempre per chiarezza.
0_but_true
restituisce uno 0, ma allo stesso tempo restituisce un valore vero. In questo modo, puoi fare qualcosa come if (identical(\@A, \@B)) {
per assicurarti che la funzione abbia funzionato. Quindi, puoi provare zero o uno.
- Assicurati di testare i tuoi parametri. Ho usato la funzione ref per fare questo.
- I truffato. Per prima cosa ho trasformato i due array ordinati in scalari. Quindi, ho usato il checksum sha1 per verificare che fossero uguali. Un checksum che utilizza la funzione sha1 dovrebbe essere abbastanza buono. È altamente improbabile che fallisca.
Il vero problema è quello se aveste array multi-allineati come questo:
@a = ("this", "that", "the\nother");
@b = ("this", "that\nthe", "other");
Utilizzando la join
il modo in cui ho fatto causerebbe lo scalari risultanti siano uguali.
fonte
2012-08-26 04:06:16
Si consiglia di scegliere un nome migliore. Nessuno di questi array è in realtà identico per definizione (che include avere gli stessi elementi nello stesso ordine). Se non ti interessa l'ordine, il nome dovrebbe riflettere questo. – cHao
Gli elementi possono apparire in un array più di una volta? – Zaid