En primer lugar, tendrás que reconsiderar tu función.
identical(@a, @b);
No pasa dos arrays a la función, pero pasa una única matriz con todos los elementos en ambas matrices. Es como si dicho:
identical(1, 2, 3, 2, 3, 1);
Para que su función sea operativa, que tendrá que pasar references a sus matrices:
identical(\@a, \@b);
yo diría que a prototype su subrutina, pero eso es probablemente va a causarte more problems que resolverá.
Si el orden no es importante, ordene las matrices antes de compararlas. Usted podría incluso ser capaz de hacer trampa ...
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;
Unas pocas notas:
- pudiera tener desreferencias, unidas, que genera la suma de comprobación, e hizo la comparación en un único estado. Los hice por separado para aclarar lo que estaba haciendo. Programáticamente, probablemente no haga ninguna diferencia.Perl optimizará todo de todos modos. Siempre voy por la claridad.
0_but_true
devuelve un 0, pero al mismo tiempo devuelve un valor verdadero. De esta forma, puede hacer algo como if (identical(\@A, \@B)) {
para asegurarse de que la función funcionó. Entonces, puedes probar cero o uno.
- Asegúrese de probar sus parámetros. Usé la función ref para hacer esto.
- I engañado. Primero convertí las dos matrices ordenadas en escalares. Luego, utilicé la suma de comprobación sha1 para verificar que son iguales. Una suma de comprobación que usa la función sha1 debería ser bastante buena. Es muy poco probable que falle.
El problema real es lo que si tuviera matrices multi-revestido como este:
@a = ("this", "that", "the\nother");
@b = ("this", "that\nthe", "other");
Utilizando el join
la manera que lo hice haría que los escalares resultantes sean iguales.
Es posible que desee elegir un nombre mejor. Ninguna de estas matrices son idénticas por definición (lo que incluye tener los mismos elementos en el mismo orden). Si no le importa el orden, el nombre debe reflejar eso. – cHao
¿Pueden aparecer los elementos en una matriz más de una vez? – Zaid