perl sorting hash natural-sort

perl - ¿Cómo puedo ordenar las claves de un hash naturalmente?



sorting natural-sort (4)

foreach my $key (sort { $a <=> $b} keys %hash) { print $hash{$key} . "/n"; }

La operación de ordenamiento toma una "subrutina" de comparación opcional (ya sea como un bloque de código, como he hecho aquí, o el nombre de una subrutina). He proporcionado una comparación en línea que trata las claves como números usando el operador de comparación numérica incorporado ''<=>''.

Tengo un hash Perl cuyas claves comienzan con, o son, números.

Si uso,

foreach my $key (sort keys %hash) { print $hash{$key} . "/n"; }

la lista podría aparecer como,

0 0001 1000 203 23

En lugar de

0 0001 23 203 1000


La respuesta de Pablo es correcta para los números, pero si quieres dar un paso más y ordenar palabras y números mixtos como lo haría un humano, ni cmp ni <=> servirían. Por ejemplo...

9x 14 foo fooa foolio Foolio foo12 foo12a Foo12a foo12z foo13a

Sort :: Naturalmente se ocupa de este problema proporcionando las rutinas nsort y ncmp .


Su primer problema es el cuerpo del bucle (que ninguna otra respuesta aquí parece indicar).

foreach my $key ( sort keys %hash ) { print $hash{$key} . "/n"; }

No sabemos cuáles son las claves de %hash , solo sabemos que son las que se le entregan como $key , en orden léxico, dentro del ciclo. A continuación, utiliza las teclas para acceder al contenido del hash, imprimiendo cada entrada.

Los valores del hash no aparecen ordenados, porque ordena las teclas .

En su lugar, desea generar los valores en orden ordenado, considere el siguiente ciclo:

foreach my $value ( sort values(%hash) ) { printf( "%s/n", $value ); }

Este ciclo imprime los valores en el orden que observas:

0 0001 1000 203 23

Para ordenarlos numéricamente, use

foreach my $value ( sort { $a <=> $b } values(%hash) ) { printf( "%s/n", $value ); }

Esto produce

0 0001 23 203 1000

que es lo que querías

Consulte el manual de Perl para la función de sort para obtener más información y muchos más ejemplos.


$key (sort { $a <=> $b} keys %hash)

hará el truco

o

$key (sort { $b <=> $a} keys %hash)

tipo descendente

o incluso

$key (sort { $a <=> $b} values %hash) $key (sort { $b <=> $a} values %hash)