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í:
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:
Using perl Syntax Highlighting
my %Hash;
$Hash{'tengo2'} = {
aca1
=> "test",
aca2
=> "test",
aca3
=> "test",
};Coloreado en 0.005 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:
Using perl Syntax Highlighting
$Hash{'tengo2'}->{'aca3'}; #testColoreado 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:
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:
Using perl Syntax Highlighting
$Hash->{'tengo2'}->{'aca4'}->{'tipo'}; # unoColoreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Saludos