• Publicidad

Ordenar un hash por valor

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Ordenar un hash por valor

Notapor Lor » 2008-02-05 08:54 @412

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.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 my $ref = $dbh_m->selectall_arrayref ( " SELECT id_campo , codigo, nombre " .
                          " FROM tabla " );

 foreach (@$ref) {$arreglo{${$_}[0]} =  ${$_}[1] . '  - ' .  ${$_}[2] ; }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


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?

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


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

Por ejemplo, suponiendo que la consulta devuelva

Código: Seleccionar todo
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: Seleccionar todo
{  ‘4’ => ’ 1 – nombre4’,
    ‘1’ => ’ 11 – nombre1’,
    ‘2’ => ’ 232 – nombre2’,
    ‘3’ => ’ 254 – nombre3’   }


Muchas gracias :wink:
Lor
Perlero nuevo
Perlero nuevo
 
Mensajes: 187
Registrado: 2005-04-28 05:47 @282

Publicidad

Notapor explorer » 2008-02-05 10:00 @458

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

Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
SELECT id_campo , codigo, nombre FROM tabla ORDER BY codigo;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Lor » 2008-02-07 15:56 @705

¡¡¡ GRANDE !!! Explorer

Muchas gracias, lo solucioné con Tie::Hash::Sorted.
Lor
Perlero nuevo
Perlero nuevo
 
Mensajes: 187
Registrado: 2005-04-28 05:47 @282


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados