• Publicidad

Ordenar hash DBI::selectall_hashref

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Ordenar hash DBI::selectall_hashref

Notapor HernandoP » 2011-05-24 04:33 @231

Hola, Tengo una duda que me está siendo imposible solucionar, pero creo que es bastante simple. Os pego el código:

$sql = 'SELECT * FROM test WHERE test_id = 1';
my $resultado = $db->selectall_hashref($sql,'test_id');

La cosa que cuando guardo en '$resultado', me da los valores sin organizar el índice del hash, son totalmente aleatorios, y a yo quiero organizarlo por orden descendiente.

Si yo hago un: 'sort $resultado', me ordena por un lado el índice y por otros, los datos. ¿Cómo tendría que hacerlo para poder tener una copia de '$resultado' pero con el índice ordenado?

A ver si me pudierais ayudar, que estoy algo perdido.

Muchas gracias.
HernandoP
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-05-24 04:26 @226

Publicidad

Re: Ordenar hash DBI::selectall_hashref

Notapor explorer » 2011-05-24 04:47 @241

Bienvenido a los foros de Perl en español, HernandoP.

El problema está en la naturaleza del funcionamiento de los hash en Perl: la forma de guardar los pares índice/valor es aleatoria (bueno, no lo es, pero a efectos nuestros como programadores, sí). A la hora de recuperarlos, lo haremos en un orden muy diferente al que fueron creados.

La solución pasa por no usar un hash, si no un array.

O también, realiza el sort(), pero referido al campo por el que quieres ordenador. Algo así:

my @ordenados = sort { $resultado->{$a}->{'id'} <=> $resultado->{$b}->{'id'} } keys %$resultado;

Con esto, estamos ordenando el hash referenciado por $resultado, usando una comparación numérica (<=>) ascendente, entre los valores de los índices 'id'.

Quizás sea más cómodo usar selectall_arrayref().
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

Re: Ordenar hash DBI::selectall_hashref

Notapor HernandoP » 2011-05-24 05:19 @263

Hola, explorer. Pues creo que voy a tener que hacerlo de otro modo, es que estoy usando HTML::Template::Associate, para asociar los valores devueltos directamente por DBI a la plantilla de HTML.

Código Asociativo DBI & HTML::Template :

my $union = HTML::Template::Associate->new( {
target => 'DBI',
create => [ {
results => $resultado,
name => $loop,
type => 'selectall_hashref'
}
]

Claro, haga lo que haga entonces ¿me va a tener desordenado el hash siempre? porque lo que me has indicado arriba me devuelve un array con los índices por orden.

¿No hay ningún modo de mantener el hash ordenado entonces?

Saludos y muchas gracias.
HernandoP
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-05-24 04:26 @226

Re: Ordenar hash DBI::selectall_hashref

Notapor explorer » 2011-05-24 05:31 @271

Viendo la documentación de HTML::Template::Associate::DBI, sí que puedes usar el método selectall_arrayref().

Si quieres mantener un hash ordenado, puedes usar un módulo como Tie::IxHash (hay más en CPAN).
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado