Il codice di seguito riportato funziona per array ad un solo livello.
Utilizza un confronto di stringhe e non distingue i valori indefiniti
dalle stringhe vuote ma definite. Modificatelo se avete esigenze diverse.
$sono_uguali = confronta_array(\@rane, \@rospi);
sub confronta_array {
my ($primo, $secondo) = @_;
no warnings; # zittisce le proteste di -w sugli undef
return 0 unless @$primo == @$secondo;
for (my $i = 0; $i < @$primo; $i++) {
return 0 if $primo->[$i] ne $secondo->[$i];
}
return 1;
}
Per le strutture multilivello, potreste voler ricorrere ad un approccio
come il seguente. Utilizza il modulo CPAN FreezeThaw:
use FreezeThaw qw(cmpStr);
@a = @b = ( "questo", "quello", [ "ancora", "roba" ] );
printf "'a' e 'b' contengono %s array\n",
cmpStr(\@a, \@b) == 0
? "gli stessi"
: "diversi";
Questo sistema funziona anche per il confronto degli hash. Qui di
seguito sono mostrate due diverse risposte:
use FreezeThaw qw(cmpStr cmpStrHard);
%a = %b = ( "questo" => "quello", "extra" => [ "ancora", "roba" ] );
$a{EXTRA} = \%b;
$b{EXTRA} = \%a;
printf "'a' e 'b' contengono %s hash\n",
cmpStr(\%a, \%b) == 0 ? "gli stessi" : "diversi";
printf "'a' e 'b' contengono %s hash\n",
cmpStrHard(\%a, \%b) == 0 ? "gli stessi" : "diversi";
La prima risposta indica che entrambi gli hash contengono gli stessi
dati, mentre la seconda indica il contrario. La scelta di quale sia per
voi preferibile è lasciato come esercizio al lettore.
|