[Madrid-pm] una de hash

Joaquin Ferrero explorer en joaquinferrero.com
Sab Ene 26 07:30:13 PST 2008


El sáb, 26-01-2008 a las 07:59 +0100, PEGG escribió:
> Hol@, es mi primera incursión en la lista, aunque estoy inscrito desde
> hace ya un tiempo. 

Yo también daré mi solución, claro, jejeje...

Estoy suponiendo que son solo esas las etiquetas que aparecen y que el
orden de salida es el indicado. Entonces una posible solución es

------------------------8<---------------------
#!/usr/bin/perl -l
@etiquetas = qw[ RI IP CN FS OR ];
$etiquetas{(split)[0]}[0]++ while <>;
print "$_ = $etiquetas{$_}[0]" for @etiquetas;
------------------------8<---------------------

pero claro, está muy resumido para una persona que empieza. Además, usa
dos variables (un @ y un %) para guardar toda la información. Es
demasiado gasto en recursos ;-)

Un poco más sencillo, aquí:
------------------------8<---------------------
#!/usr/bin/perl

%etiquetas = (
    RI => [ 1, 0 ],
    IP => [ 2, 0 ],
    CN => [ 3, 0 ],
    FS => [ 4, 0 ],
    OR => [ 5, 0 ],
);

while (<>) {
    @campos = split;
    $etiquetas{$campos[0]}->[1]++;
}

foreach (
        sort {
            $etiquetas{$a}->[0] <=> $etiquetas{$b}->[0]
        } keys %etiquetas
    ) {
    print "$_ = $etiquetas{$_}->[1]\n";
}
------------------------8<---------------------
split queda reducido a lo mínimo, pues lo que tiene que dividir se
ajusta a su funcionamiento por defecto.

En el mismo hash %etiquetas almacenamos tanto el orden de aparición como
el número de veces que aparece en el fichero de entrada.

En la lectura del while vamos incrementando el segundo componente del
array asociado a cada clave. Y en el foreach ordenamos la salida de las
claves del hash por el valor del primer componente.

Y seguro que hay otras veinte formas distintas...

-- 
Joaquin Ferrero <explorer en joaquinferrero.com>



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