Página 1 de 1

Ordenar este array alfabéticamente por el valor

NotaPublicado: 2009-04-30 15:40 @695
por danimera
Tengo este hash:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$loop{$id} = $nombre;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Bueno y son varios id con varios nombres; lo que deseo es ordenarlos alfabéticamente por el valor y no por la llave, intenteté algo por aquí pero no resultó y me urge ordenar esta hash.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $llave (sort {$loop{$a} <= $loop{$b}} keys %loop){
                $loop{$llave} = $llave;
        }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Los valores que contiene son de la siguiente forma:

Código: Seleccionar todo
$loop{5} = 'punto5';
$loop{4} = 'punto3';
$loop{3} = 'punto7';
$loop{2} = 'punto1';

NotaPublicado: 2009-04-30 15:53 @703
por explorer
Los diccionarios no se pueden ordenar, salvo que uses algo como Tie::IxHash, como se comenta en el perlfaq4, How can I make my hash remember the order I put elements into it?.

Hay varias técnicas para ordenar por valor, como se comenta en el perlfaq4, How do I sort a hash (optionally by value instead of key)?.

NotaPublicado: 2009-04-30 18:21 @806
por danimera
Bueno, no, me referí más bien a imprimirlos en orden de los valores...

NotaPublicado: 2009-04-30 18:28 @811
por explorer
Pues si solo quieres sacar ordenados los valores, te vale con un
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print sort values %loop;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

NotaPublicado: 2009-05-03 10:37 @484
por Jenda
Casi. Debes usar <=> para comparar números o cmp para comparar cadenas. La expresión sort debe devolver -1 si el primer argumento es menor (debe ser ordenado antes del otro), 0 si los argumentos tienen el mismo tamaño y 1 si el primer argumento es mayor.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $llave (sort {$loop{$a} <=> $loop{$b}} keys %loop){
...
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4