• Publicidad

Ayuda con hash enorme

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

Ayuda con hash enorme

Notapor BigBear » 2011-06-20 10:11 @466

Necesito crear un hash con la siguiente estructura

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
tengo1 => aca1 => "test"
          aca2 => "test"
          aca3 => "test
          aca4 => "tipo" => "uno"
               => "tipo1" => "dos"

tengo2 => aca1 => "test"
          aca2 => "test"
          aca3 => "test
          aca4 => "tipo" => "uno"
               => "tipo1" => "dos"
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4



El problema es no lo quiero hecho sino que necesito entender cómo hacerlo paso a paso.

¿ Alguien me puede ayudar ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Ayuda con hash enorme

Notapor kidd » 2011-06-20 10:27 @477

Hola,

La estructura como la muestras, nunca la vas a lograr con Perl, por la sencilla razón que Perl "aplana" las listas cuando son guardadas en un array o un hash. Entonces, realmente la estructura que tu quieres se vería así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
tengo1 => {
          aca1 => "test"
          aca2 => "test"
          aca3 => "test
          aca4 => { "tipo"  => "uno"
                    "tipo1" => "dos"
                  }
          }

tengo2 => {
          aca1 => "test"
          aca2 => "test"
          aca3 => "test
          aca4 => {
                  "tipo"  => "uno"
                  "tipo1" => "dos"
                  }
          }
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Entonces para guardar un hash/array dentro de un hash/array debes de guardar su referencia, pues los elementos solamente pueden ser valores escalares. La referencia es un valor escalar que determina el lugar en memoria donde se encuentra alojado un valor.

En este caso, la llave tengo2 contiene realmente una referencia a tu lista hash, tengo2->aca4 a su vez tendría un referencia a un hash, etc.

¿Cómo hacerlo?

Básicamente estarías creando hash/array anónimos; por ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %Hash;

$Hash{'tengo2'} = {
          aca1 => "test",
          aca2 => "test",
          aca3 => "test",
};
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


¿Ves cómo en vez de usar paréntesis () usé corchetes {}? Esto indica que no estoy haciendo una lista, sino una referencia a una lista.

Luego para ver el valor de aca3, hacemos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$Hash{'tengo2'}->{'aca3'}; #test
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El uso del operador -> es justamente para de-referenciar, es decir, convertir un número que es un punto en la memoria, al valor al que está apuntando.

Luego vamos a crear el hashref para aca4:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$Hash{'tengo2'}->{'aca4'} = {
                  "tipo"  => "uno",
                  "tipo1" => "dos"
};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo mismo, le guardamos una referencia anónima a nuestra lista, y para recuperar los valores por medio de llaves, hacemos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$Hash->{'tengo2'}->{'aca4'}->{'tipo'}; # uno
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Re: Ayuda con hash enorme

Notapor explorer » 2011-06-20 10:35 @482

Todo esto lo tienes explicado en perldoc perldsc (en inglés), aunque la introducción la puedes encontrar en perldoc perldata (en español).
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


Volver a Básico

¿Quién está conectado?

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

cron