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)