Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Ordenar un hash por valor

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto
Mensaje Mar Feb 05, 2008 7:54 am
Lor
Perlero Nuevo
Perlero Nuevo
Registrado: 28 Abr 2005
Mensajes: 88
Ubicación: Argentina, Santa FE
Ordenar un hash por valor Responder citando

Ante todo muchas gracias.

Suponiendo que quiero volcar el resultado de una consulta en un hash, y luego ordenar el hash, no por la key sino por el value.

El value se compone de la concatenación de dos campos de la tabla: uno numérico y otro varchar.

Perl:
my $ref = $dbh_m->selectall_arrayref ( " SELECT id_campo , codigo, nombre " .
                          " FROM tabla " );

 foreach (@$ref) {$arreglo{${$_}[0]} =  ${$_}[1] . '  - ' .  ${$_}[2] ; }


Obtenido el hash ahora, ¿cómo lo ordeno por valor cuando quiero RESPETAR en la ordenación el campo numérico que formó la concatenación y ahora ya es un string?

Perl:
  my (@arreglo) =   sort { $ arreglo {$a} <=> $ arreglo {$b}} keys % arreglo;


¿Cómo hago para ordenar el resultado de la consulta previa a la concatenación?

Por ejemplo, suponiendo que la consulta devuelva

Código:
1 , 11 ,  nombre 1
2,  232 , nombre 2
3,  254 , nombre 3
4, 1,      nombre4


quiero obtener un hash ORDENADO de la siguiente forma: tiene en cuenta el campo numérico de la concatenación:

Código:
{  ‘4’ => ’ 1 – nombre4’,
    ‘1’ => ’ 11 – nombre1’,
    ‘2’ => ’ 232 – nombre2’,
    ‘3’ => ’ 254 – nombre3’   }


Muchas gracias Wink
Mensaje Mar Feb 05, 2008 9:00 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3842
Ubicación: Valladolid, España
Responder citando

Respuesta inmediata: no se puede. Los hash no se almacenan en un determinado orden. Perl no garantiza el mantenimiento del orden en el almacenamiento o salida de claves o valores. Lo único garantizado es que las funciones keys() y values() devuelven sus valores en el mismo orden (cada clave n-ésima corresponde con el valor n-ésimo).

Respuesta modular: existen módulos, como el Tie::Hash::Sorted que permiten gestionar hash con un determinado orden. Como extra, mira en la sinopsis: hay un ejemplo de cómo ordenar un hash a partir de los valores.

Respuesta clásica: si quieres mantener un orden, usa un array. Eso quiere decir que debes guardar toda la información (claves y valores) como elementos dentro de un array.

Respuesta DB: la ordenación te la puede dar el propio motor de la base de datos, modificando la consulta. Algo como

SQL:
SELECT id_campo , codigo, nombre FROM tabla ORDER BY codigo;
Mensaje Jue Feb 07, 2008 2:56 pm
Lor
Perlero Nuevo
Perlero Nuevo
Registrado: 28 Abr 2005
Mensajes: 88
Ubicación: Argentina, Santa FE
Responder citando

¡¡¡ GRANDE !!! Explorer

Muchas gracias, lo solucioné con Tie::Hash::Sorted.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group