• Publicidad

Inversión de Hashes

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

Inversión de Hashes

Notapor bio_hazard » 2008-01-22 13:47 @616

Hola a todos, primero de todo felicitaros por la gran tarea que lleváis a cabo... Creo que sois una gran herramienta para todos los que, como yo, nos iniciamos en el mundo de la programacion en Perl.

Creo que mi duda será fácil de contestar... la cuestión es que tengo que crear un hash el cual he creado de la siguiente manera:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
%hash = (
    "diez",10,
    "cien",100,
    "mil",1000,
);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Representa que diez, cien y mil son las claves y 10, 100, 1000 son los valores. A partir de aquí, cómo podría hacer para invertir eso, es decir, que diez, cien y mil pasen a ser valores y 10, 100 y 1000 las claves.

Gracias por todo, ¡a ver si me podéis ayudar!

BiOHAZARD
bio_hazard
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2008-01-22 13:37 @609

Publicidad

Notapor explorer » 2008-01-22 14:19 @638

Bienvenido a los foros de Perl en Español, bio_hazard.

A ver si el siguiente ejemplo te ayuda:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use Data::Dumper;

%hash = (
    diez => 10,
    cien => 100,
    mil  => 1000,
);

print Dumper \%hash;

%rehash = reverse %hash;

print Dumper \%rehash;

 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero... ¿Quieres hacer algo relativo a la conversión entre ordinales y decimales?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor bio_hazard » 2008-01-23 07:39 @360

¡Ei, gracias, me funciona correctamente!
No es relativo a la conversión... lo del diez y tal era un ejemplo tonto... ¡jeje!

Pero gracias igualmente... ¡me has sido de mucha ayuda! ¡Me estoy planteando hacer un par de cursos de Perl y todo!

¡¡Gracias!!
bio_hazard
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2008-01-22 13:37 @609

Notapor danimera » 2008-01-23 13:18 @596

Pero explorer, si se está iniciando en Perl una persona y le muestras eso... :P no mentirás, aunque es bueno mostrarle eso. Quiero mostrar lo que te ahorra Perl es decir lo que haría uno normalmente. Mira:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

%hash = (
    diez => 10,
    cien => 100,
    mil  => 1000,
);

@lista_de_claves = keys(%hash);
@lista_de_valores = values(%hash);


$i =0;
foreach $valor(@lista_de_valores) {
        %hash_temp{$valor} = @lista_de_claves[$i];
        $i=$i+1;
};

%hash = %hash_temp;

 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Algo así más o menos se le ocurriría a una persona que se inicia con Perl ^^ o quien sabe que otras cosas.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Notapor explorer » 2008-01-23 14:13 @634

Tienes razón, hay que ir paso a paso...

Pero reverse() es una de las muchas funciones que tiene Perl y que está documentada. En concreto, dice:

This operator is also handy for inverting a hash, although there are some caveats. If a value is duplicated in the original hash, only one of those can be represented as a key in the inverted hash. Also, this has to unwind one hash and build a whole new one, which may take some time on a large hash, such as from a DBM file.

que se puede traducir por:
Este operador es también útil para invertir un hash, pero con algunas salvedades. Si un valor está duplicado en el hash original, solo uno de ellos será representado como una clave en el hash invertido. También, implica desplegar un hash y construir uno nuevo completo, algo que puede tomar algún tiempo en un hash grande, como en un fichero DBM.


Así que SÍ que está comentado en la documentación. El problema es ese: que la documentación es enorme.

Otra forma de hacerlo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    @rehash{ values %hash } = keys %hash;

 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Aquí, vamos sacando las claves con keys() y las vamos guardando en el nuevo hash (que sabemos que lo es solo por la presencia de las llaves). Cada clave de %hash se guarda como valor de %rehash, asociada a una nueva clave que se extrae de los valores de %hash (con values()).

Perl garantiza que el orden de salida de las claves corresponde con el de los valores. Por eso la correspondencia es uno a uno.

Y como estamos manejando una lista de valores, hemos cambiado el sigil '%' por '@'.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor bio_hazard » 2008-01-24 12:31 @563

¿Gracias a los dos! Quizás la segunda forma es más comprensible con el tema del reverse... Lo he intentado en casa y mejor con reverse y un foreach. ¡Gracias!
bio_hazard
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2008-01-22 13:37 @609


Volver a Básico

¿Quién está conectado?

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

cron