[Madrid-pm] una de hash

DervishD bugs en dervishd.net
Sab Ene 26 01:13:56 PST 2008


Hola ¿PEGG? ;)

* PEGG <preiddy en gmail.com> dixit:
> Tengo que identificar cada etiqueta y contar
>  cuantas veces aparece, hasta aquí no hay ningún problema. Mi problema
> comienza cuando lo imprimo, es necesario imprimirlo en la posición en que
> aparece. Por ejemplo
> RI
> IP
> CN
> FS
> OR
> 
> quiero que imprima como está arriba y no
> IP = 286895
> CN = 55
> OR = 37
> FS = 172915
> RI = 18073
> 
> ni ordenado de mayor a menor y viceversa.
> Alguien sabe si es posible????

Claro que es posible. No te pongo el código que es muy temprano para ser
sábado y la voy a cagar, pero te digo cómo hacerlo.

Crea un array para almacenar el orden de las etiquetas tal y como
aparecen. Cuando veas una etiqueta, si YA EXISTE en la HASH, la procesas
como ya lo haces ahora, sumando uno al número de veces que la has visto.

Lo importante va ahora: si la etiqueta NO EXISTE en la HASH, haces
"push" de ella en tu array. Al final, en el array, las etiquetas están
ordenadas según van a apareciendo en el fichero de texto, y gracias a la
colaboración de tu tabla hash, son apariciones únicas.

> Esto es lo que hice
> while (<>)
> {
>     @campos=split(/ /,$_);
>     $todo{"$campos[0]"}++;
> }

Aquí te haría falta un simple "if" para saber si la etiqueta existe o no
en la tabla hash (ojo, ANTES del incremento), y hacer el push al array.

> foreach my $campo (sort {$todo{$a} <=> $todo{$b}} keys %todo)
> {
>     print "$campo = $todo{$campo}\n";
> }

Y esto lo cambias por algo como:

# Ya, ya sé que los nombres de variable dan grima.
# Es sábado y es temprano, bastante que pongo nombres XD
foreach my $etiqueta (@orden_de_etiquetas) {
    print "$etiqueta = $todo{$etiqueta}\n";
}

Como tu array y tu hash se han creado de forma sincronizada, no tienes
que comprobar nada. Si una etiqueta aparece en el fichero original,
estará en su posición adecuada en "@orden_de_etiquetas", y su valor en
%todo existirá. Como, además, el array está ordenado por "slot" y tú has
ido añadiendo las etiquetas con "push", están ya en el orden adecuado,
según aparecen en el fichero.

Espero que te sirva. Sólo tienes que escribir el "if".

Raúl Núñez de Arenas Coronado
-- 
Linux Registered User 88736 | http://www.dervishd.net
It's my PC and I'll cry if I want to... RAmen!
We are waiting for 13 Feb 2009 23:31:30 +0000 ...


Más información sobre la lista de distribución Madrid-pm