[Perl] Pregunta #3
Gunnar Wolf
gwolf@campus.iztacala.unam.mx
Tue, 12 Mar 2002 11:50:09 -0600 (CST)
> > Si hacemos el doble foreach, realmente multiplicamos el Tama=F1oLis=
ta 1
> > por el Tama=F1oLista 2, haciendose para listas largas millones de
> > comparaciones... Pero si sumanos las Listas, vamos a tener un numero mu=
cho
> > mas peque=F1o de comparaciones que hacer... La soluci=F3n entonces:
> >
>
> Si solo quieres eliminar repetidos, no funcionaria hacer dos hashes y
> unirlos?, es decir;
>
> @lista =3D (@reales, @mientras);
> %hash1 =3D @lista;=09=09#me aseguro que @lista[2n] sean unicos
> %hash2 =3D reverse(@lista);=09#me aseguro que @lista[2n + 1] sean unicos
> %resultado =3D (%hash1, %hash2); # aqui ya tengo resultados unicos no?
>
> @resultado =3D %resultado;=09#tu lista con datos no repetidos.
>
> Espero que te sea util.
Ummm... funciona, pero es poco claro, y en el 50% de los casos va a
fallar si usas -w o use warnings:
@lista =3D ((1,2,3),(2,3,4,5,6,7));
%hash1 =3D @lista;
%hash2 =3D reverse @lista;
%res =3D (%hash1,%hash2);
@res =3D sort %res;
print "Llaves Hash 1: ",keys(%hash1),"\nValores Hash 1: ",values(%hash1),
"\nLlaves Hash 2: ",keys(%hash2),"\nValores Hash 2: ",values(%hash2),
"\nLlaves hash resultado: ",keys(%res),"\nValores hash resultado: ",
values(%res),"\nArreglo resultado: ",@res,"\n";
Odd number of elements in hash assignment at - line 2.
Odd number of elements in hash assignment at - line 3.
Use of uninitialized value in sort at - line 5.
Use of uninitialized value in sort at - line 5.
Use of uninitialized value in sort at - line 5.
Llaves Hash 1: 7135
Use of uninitialized value in print at - line 6.
Valores Hash 1: 246
Llaves Hash 2: 7135
Use of uninitialized value in print at - line 6.
Valores Hash 2: 624
Llaves hash resultado: 7135
Use of uninitialized value in print at - line 6.
Valores hash resultado: 624
Use of uninitialized value in print at - line 6.
Arreglo resultado: 1234567
Como ver=E1s, es bastante cochino... Adem=E1s, fue a prop=F3sito que eligie=
ra
una @lista con un n=FAmero impar de elementos - la =FAltima llave asignada =
a
tus hashes va con un valor indefinido. Y la raz=F3n por la que sirve cuando
lo pasas a %res es que todo est=E1 duplicado. De hecho, podr=EDas ahorrarte
los hashes temporales, y utilizar =FAnicamente la l=EDnea:
%res =3D (@lista, reverse @lista);
aunque caer=EDas en los mismos problemas de los valores no inicializados y
el n=FAmero impar de elementos en el hash.
Es mucho m=E1s simple de entender, menos propenso a errores y mucho m=E1s
limpio, a mi entender:
@lista =3D ((1,2,3),(2,3,4,5,6,7));
%temp =3D (); # Nunca olvides inicializar :)
foreach my $elem (@lista) {
$temp{$elem} =3D 1;
}
@resultado =3D sort keys %temp;
1234567
Y ya.
--=20
Gunnar Wolf - gwolf@campus.iztacala.unam.mx - (+52-55)5623-1118
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF