[Perl] Pregunta #2
Gunnar Wolf
gwolf@campus.iztacala.unam.mx
Tue, 12 Mar 2002 19:05:37 -0600 (CST)
> Ciertamente, aunque tambien estas haciendo comparaciones... La otra =
que
> se me ocurrio que indican mas adelante es...
>
> my %Temporal;
> foreach $Mie (@MIENTRAS) {
> $Temporal{$Mie}++;
> }
> foreach $Rea (@REAL) {
> $Temporal{$Rea}++;
> }
>
> @Real=3D();
>
> foreach $Tem (keys %Temporal) {
> push @Real, $Tem;
> }
>
> Aqui no harias ninguna comparaci=F3n, y usarias los hashes de PERL.
> Obviamente, esto solo es posible a que perl tiene estos hashes, ser=EDa c=
osa
> de ver como podria hacerse con un lenguaje que no los tuviera.... Realmen=
te
> no es necesario hacer el ++, es solamente para darle un valor, pero podr=
=EDa
> servir para saber cuantos duplicados hubo y cuantos nuevas lineas se
> metieron. Adem=E1s, en mi caso, tengo que procesar el MIENTRAS primero p=
ara
> no perder los datos de REAL que haya duplicados, porque realmente tengo m=
as
> campos =E9ste.
No es dif=EDcil implementar hashes - en cualquier libro de estructuras de
datos viene c=F3mo. Y son estructuras REALMENTE r=E1pidas.
Te sugiero hacer una asignaci=F3n ($Temporal{$Rea}=3D1) en vez de un
incremento ($Temporal{$Rea}++); =BFPor qu=E9? Intenta ver qu=E9 es lo que t=
iene
que hacer Perl tras bambalinas: (simplificado)
$Temporal{$Rea}++:
1- Traer (a un registro del CPU) el valor que contiene la memoria a la que
apunta $Rea
2- Usarlo como =EDndice sobre %Temporal
3- Calcular la direcci=F3n de memoria a la que corresponde $Temporal{$Rea}
4- Traer (a un registro del CPU) el valor que contiene la memoria a la que
apunta $Temporal{$Rea}
5- Oops - La memoria referenciada est=E1 vac=EDa (estamos aumentando un val=
or
indefinido). Llama al manejador apto para esta situaci=F3n (que, si est=
=E1s
usando -w, incluye notificar al usuario).
6- Pon un cero en vez del valor indefinido
7- Incrementar el valor en uno
8- Perl tiene un buen compilador. No tenemos que volver a calcular la
direcci=F3n de $Temporal{$Rea}... Pero s=ED tenemos que guardar el regis=
tro
que reci=E9n incrementamos en $Temporal{$Rea}.
$Temporal{$Rea}=3D1:
1- Traer (a un registro del CPU) el valor que contiene la memoria a la que
apunta $Rea
2- Usarlo como =EDndice sobre %Temporal
3- Calcular la direcci=F3n de memoria a la que corresponde $Temporal{$Rea}
4- Guardar en esta direcci=F3n el valor '1'.
Si cuentas =FAnicamente el n=FAmero de pasos ejecutados, tenemos ya una mej=
ora
del 50%. Conviene no incrementar cuando puedes asignar. :)
--=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