De perlfaq4, la respuesta a "http://faq.perl.org/perlfaq4.html#How_do_I_sort_a_hash" tiene la mayor parte de la información que necesita para armar su código.
Es posible que también quiera ver el capítulo sobre Ordenando en Learning Perl.
Chris tiene una respuesta completamente buena, aunque odio usar values
así. Una forma más familiar para hacer la misma cosa es ir a través de las claves del hash de nivel superior, pero ordenar por la clave de segundo nivel:
my @sorted_hashes =
sort { $hash2->{$a}{count} <=> $hash2->{$b}{count} }
keys %hash2;
lo hago de esta manera porque es un poco menos endiablada .
¿Cómo puedo ordenar un hash (opcionalmente por valor en lugar de clave)?
(aportado por Brian D Foy)
Para ordenar un hash, empezar con las teclas. En este ejemplo, proporcionamos la lista de claves para la función de clasificación que luego las compara ASCIIbetically (lo que puede verse afectado por la configuración de su configuración regional). La lista de salida tiene las teclas en orden ASCIIbético. Una vez que tenemos las claves, podemos revisarlas para crear un informe que enumera las claves en orden ASCIIbético.
my @keys = sort { $a cmp $b } keys %hash;
foreach my $key (@keys)
{
printf "%-20s %6d\n", $key, $hash{$key};
}
Sin embargo, podríamos obtener más fantasía en el bloque sort(). En lugar de comparar las claves, podemos calcular un valor con ellas y usar ese valor como comparación.
Por ejemplo, para hacer que el orden de nuestros informes no distinga entre mayúsculas y minúsculas, usamos la secuencia \ L en una cadena de comillas dobles para que todo esté en minúscula. El bloque de clasificación() compara los valores en minúscula para determinar en qué orden colocar las claves.
my @keys = sort { "\L$a" cmp "\L$b" } keys %hash;
Nota: si el cómputo es caro o el hash tiene muchos elementos, es posible que desee buscar en el Schwartzian Transform para almacenar en caché los resultados del cálculo.
Si, en cambio, queremos ordenar por el valor hash, usamos la tecla hash para buscarlo. Todavía obtenemos una lista de claves, pero esta vez están ordenadas por su valor.
my @keys = sort { $hash{$a} <=> $hash{$b} } keys %hash;
A partir de ahí podemos volvernos más complejos. Si los valores hash son los mismos, podemos proporcionar una ordenación secundaria en la tecla hash.
my @keys = sort {
$hash{$a} <=> $hash{$b}
or
"\L$a" cmp "\L$b"
} keys %hash;
¿Quiere decir que desea obtener la lista de hashes (como hash1) ordenados según el recuento de los valores en hash2? – Jagmal
yes Jagmal eso significa que quiero ordenar con respecto a $ hash2 {"asd"} {count}. – systemsfault