[perl] como se usan los hash?
Bolo Lacertus
lacertus@servidor.unam.mx
Tue, 27 Oct 1998 23:17:02 -0600 (CST)
Saludos!!!
Bueno, debe usted de leer con un poquitín de mas cuidado los tutoriales,
porque te hiciste pelotas con las clases de datos.
On Tue, 27 Oct 1998, RUBEN wrote:
> llevo un rato peleandome con unos hashes. A ver si alguien sabe como
> hacer lo siguiente:
> | "llave1"| (valor1,valor2,valor3)|
> | "llave2"| (valor4 ......valorn) |
Ok, si se puede y sale muy facilito, pero hay que comprender un par de
cosas primero, de entrada, que vas a necesitar referencias para hacerlo.
> un arreglo. He estado dando vueltas alrededor de algo como esto:
> @arreglo_chido{'llave'} = (1,2,3,4,56);
Primera nota, hay tres clases de datos (no les digo tipos porque todas
pueden tener enteros, flotantes, cadenas y demás) a saber:
Escalares: tienen un solo valor y siempre inician con $ (su nombre)
Arreglos: Tienen varios valores escalares y su nombre inciia con @
Hashes: Tienen varios valores escalares y su nombre inicia con %
Nota, para arreglos y hashes el nombre inicia con @ o % cuando nos
referimos a TODO el arreglo o hash, si solo nos referimos a un elemento
entonces estamos hablando de un escalar y su nombre inicia con $.
A que voy, un escalar de ejemplo sería:
$ej=10;
print $ej;
# Que por supuesto escribirá "10"
Un arreglo de ejemplo:
@ej=(1,2,3,4,5);
print @ej;
#que escribirá TODO el arreglo en algo como "12345"
print $ej[1];
#que escribira el escalar segundo elemento del arreglo @ej, notese que al
#especificar un elemento con el índice, lo que tenemos es un ESCALAR (usar
# $ antes del nombre)
Un hash de ejemplo:
%ej=("uno",1,"dos",2,"tres",3);
#o de modo mas comunmente aceptado, pero equivalente
%ej=("uno"=>1,"dos"=>2,"tres"=>3);
print %ej;
#Eso imprime unos números que a la fecha no se para que sirvan, pero que
#representan a todo el hash.
print $ej{"uno"};
#imprime el escalar contenido en el hash bajo el índice "uno", es decir 1
Ok, ahora lo bueno, el hash no puede contener sino escalares, por lo que
el único modo de meterle arreglos es meter en el hash una referencia a
escalar, ok, esto puede ser un rollo largo así que hagamoslo corto, en
Perl lo que sirve para meter valores sirve para sacarlos, así que dejemos
en mencion lo de que hay referencias involucradas y vayamos a como se
resuelve tu problema.
Eventualmente, lo que vas a tener es que para crear tu hash de arreglos
vas a tener la llave que quieres en el hash y los varlores del arreglo.
Por ejemplo:
primero
(1,2,3,4,100,200)
segundo
(a,b,c,d)
Ok, por hacerlo facil pero general usemos dos variables intermedias,
$llave e $indice (con propósitos autoexplicativos).
Deja que Perl se preocupe de las incializaciones, simplemente usemos la
estructura de datos:
#Primer elemento del arreglo contenido en el has bajo la llave "primero"
que debe tomar el valor de 1.
$llave="primero";
$indice=0;
$hashchido{$llave}->[$indice]=1;
#Segundo elemento, misma llave, toma el valor 2.
$indice=1;
$hashchido{$llave}->[$indice]=2;
# Y bueno, así nos seguimos.
#¿Como lo saco?, del mismo modo en que lo metimos: (sin albur)
$llave="primero";
$indice=0;
print $hashchido{$llave}->[$indice];
#Nos imprime un humilde 1.
#No te preocupes por destruir la estructura y liberar memoria al final del
#programa, Perl se encarga.
Ok, cosas a observar:
- Aunque la estructura de datos resultante esalgo compleja, como lo que
queremos tener de valor es un escalar, el nombre inicia con $
- Lo que tenemos es un Hash que (mediante referencias ocultas) contiene
arreglos y por eso damos primero la llave (para saber a cual arreglo del
hash nos referimos) y luego el índice (para saber a cual elemento del
arreglo nos referimos).
- Entre el indicador de llave y el de índice ponemos el operador ->, hay
mucho que decir de el, pero dejemoslo de ese tamaño.
Ok, esto está explicado en el modo mágico, mistico, misterioso, de que te
pongas a estudiar como son en realidad las clases de datos y como se
emplean las referencias dependerá que efectvamente sepas que estas
haciendo y tengas mas elementos para resolver cualquier problema que se te
presente, ya irás viendo que con las cosas que levantas con hashes y
referencias se pueden atacar unos problemas de complejidad pasmosa con
mucha facilidad.
Por cierto, la sección de la referencia a consultar (si le haces el feo a
los tutoriales y entienes lo que sea si está en blanco y negro) es PERLDAT
para las clases de datos y PERLREF para las referencias.
Esperando que la alquimia te funcione: Daniel Sol
Bolo Lacertus: lacertus@servidor.dgsca.unam.mx ==~\___\
http://132.248.71.81/cgi-bin/lacertus/hola =__vvvv
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS/GE/GED d>d? s:+ a-- C++>+++$ US++ P+++>++++$ L E? W++>+++ N+ o? K-
w--- O !M V- PS+ PE->-- Y+ PGP+ t+ 5? X- R@ tv-- b++>- DI+ D+ G+>++ e+>++
h* r-(*) z+
------END GEEK CODE BLOCK------
--------- Pie de mensaje --------------------------------
Visite: http://tlali.iztacala.unam.mx/~randrade/perl.shtml
Cancelar inscripcion:
mail to: majordomo@tlali.iztacala.unam.mx
text : cancelacion perl