Programación en perl
        hashes
¿Qué es un hash?


Estructura de datos que permite almacenar
un número indeterminado de datos indexados
por nombre.

Es como un array en el que sustituimos el
índice numérico por una cadena.
¿Qué es un hash?
¿Qué es un hash?
Supongamos que queremos almacenar la siguiente información
de un coche: marca, modelo, numero de puertas y potencia.
¿Qué es un hash?
Supongamos que queremos almacenar la siguiente información
de un coche: marca, modelo, numero de puertas y potencia.

$coche[0]=‘ford’
$coche[1]=‘scort’
$coche[2]=5
$coche[3]=‘150cv’
¿Qué es un hash?
Supongamos que queremos almacenar la siguiente información
de un coche: marca, modelo, numero de puertas y potencia.

$coche[0]=‘ford’
$coche[1]=‘scort’
$coche[2]=5
$coche[3]=‘150cv’

Problema: nos tenemos que acordar de qué significa cada
índice.
¿Qué es un hash?
Supongamos que queremos almacenar la siguiente información
de un coche: marca, modelo, numero de puertas y potencia.

$coche[0]=‘ford’
$coche[1]=‘scort’
$coche[2]=5
$coche[3]=‘150cv’

Problema: nos tenemos que acordar de qué significa cada
índice.

Problema aún peor: si no lo documentamos, el programador
que tenga que revisar vuestro código dos años después no
creo que os tenga en muy buena estima.
¿Qué es un hash?


Accediendo al elemento de un hash:

  $coche{‘marca’} = ‘ford’
¿Qué es un hash?

     $ porque en un
  elemento de un hash
almacenamos un escalar

                                 clave      valor

       Accediendo al elemento de un hash:

           $coche{‘marca’} = ‘ford’

                identificador
             (nombre del hash)
¿Qué es un hash?
¿Qué es un hash?
La clave puede ser una expresión perl:
¿Qué es un hash?
La clave puede ser una expresión perl:

   $coche{$variable}=‘ford’;
¿Qué es un hash?
La clave puede ser una expresión perl:

   $coche{$variable}=‘ford’;

   $coche{ &obtenerClave };
¿Qué es un hash?
La clave puede ser una expresión perl:

   $coche{$variable}=‘ford’;

   $coche{ &obtenerClave };

   $coche{ $clave+‘_key’};
¿Qué es un hash?
La clave puede ser una expresión perl:

   $coche{$variable}=‘ford’;

   $coche{ &obtenerClave };

   $coche{ $clave+‘_key’};

Al hacer $coch{‘marca’} = ‘ford’
¿Qué es un hash?
La clave puede ser una expresión perl:

   $coche{$variable}=‘ford’;

   $coche{ &obtenerClave };

   $coche{ $clave+‘_key’};

Al hacer $coch{‘marca’} = ‘ford’

   Si la clave no existe, se crea y se le asigna el valor ‘ford’
¿Qué es un hash?
La clave puede ser una expresión perl:

   $coche{$variable}=‘ford’;

   $coche{ &obtenerClave };

   $coche{ $clave+‘_key’};

Al hacer $coch{‘marca’} = ‘ford’

   Si la clave no existe, se crea y se le asigna el valor ‘ford’

   Si la clave ya existe, se sobreescribe el valor.
¿Qué es un hash?
La clave puede ser una expresión perl:

   $coche{$variable}=‘ford’;

   $coche{ &obtenerClave };

   $coche{ $clave+‘_key’};

Al hacer $coch{‘marca’} = ‘ford’

   Si la clave no existe, se crea y se le asigna el valor ‘ford’

   Si la clave ya existe, se sobreescribe el valor.

Si se recupera una clave que no existe, se obtiene    undef.
Definiendo un hash
       Para referirnos al hash completo utilizamos el
       símbolo %, igual que para referirnos a un array
       utilizábamos @

          %choche

       Podemos convertir un hash en una lista y una lista
       en un hash:

1.%some_hash = ('foo', 35, 'bar', 12.4, 2.5, 'hola', 'wilma',
  1.72e30, 'pedro', "adiosn");
Hash en contexto de
            lista

     Un hash en contexto de lista es una lista de
     parejas clave valor



1.                  @coche = %coche
Hash en contexto de
               lista

       ¿Qué hace la siguiente línea de código?




1.%coche_invertido = reverse %coche
“The Big Arrow”


       Otra forma de inicializar los hashes en perl



1.my %coche = (
2.    'marca' => 'ford',
3.    'modelo' => ‘scort’,
4.    'puertas' => 5,
5.    'potencia' => '140cv',
6.);
Funciones

keys

 Devuelve una lista con las claves de un
 hash

values

 Devuelve una lista con los valores de un
 hash
Ejercicio

Escribir una función en perl (printHash) que
muestre por pantalla un hash con el siguiente
formato:

clave1        =>          valor1
clave2        =>          valor2
clave3        =>          valor3
Funciones
each

 Esta función devuelve en cada llamada una
 pareja clave/valor como una lista de dos
 elementos

 Con cada llamada, la función devuelve una
 nueva pareja clave valor

 Cuando termina (no quedan más elementos)
 se devuelve una lista vacía
Funciones

        each


while ( ($key, $value) = each %hash ) {
    print "$key => $valuen";
}
Funciones

        exists

           Devuelve verdadero si la clave existe y
           falso en caso contrario


if (exists $coche{"marca"}) {
    print "Marca: $coche{‘marca’}n";
}
Funciones
        delete

           Elimina una clave del hash (y su
           correspondiente valor)

           Si la clave no existe, no da ni error ni
           warning.

my $clave = "modelo";
delete $coche{$modelo};
El hash %ENV


Almacena las variables de entorno.

Escribir un script en perl que lo muestre por
pantalla.

Perl5 hashes

  • 1.
  • 2.
    ¿Qué es unhash? Estructura de datos que permite almacenar un número indeterminado de datos indexados por nombre. Es como un array en el que sustituimos el índice numérico por una cadena.
  • 3.
  • 4.
    ¿Qué es unhash? Supongamos que queremos almacenar la siguiente información de un coche: marca, modelo, numero de puertas y potencia.
  • 5.
    ¿Qué es unhash? Supongamos que queremos almacenar la siguiente información de un coche: marca, modelo, numero de puertas y potencia. $coche[0]=‘ford’ $coche[1]=‘scort’ $coche[2]=5 $coche[3]=‘150cv’
  • 6.
    ¿Qué es unhash? Supongamos que queremos almacenar la siguiente información de un coche: marca, modelo, numero de puertas y potencia. $coche[0]=‘ford’ $coche[1]=‘scort’ $coche[2]=5 $coche[3]=‘150cv’ Problema: nos tenemos que acordar de qué significa cada índice.
  • 7.
    ¿Qué es unhash? Supongamos que queremos almacenar la siguiente información de un coche: marca, modelo, numero de puertas y potencia. $coche[0]=‘ford’ $coche[1]=‘scort’ $coche[2]=5 $coche[3]=‘150cv’ Problema: nos tenemos que acordar de qué significa cada índice. Problema aún peor: si no lo documentamos, el programador que tenga que revisar vuestro código dos años después no creo que os tenga en muy buena estima.
  • 8.
    ¿Qué es unhash? Accediendo al elemento de un hash: $coche{‘marca’} = ‘ford’
  • 9.
    ¿Qué es unhash? $ porque en un elemento de un hash almacenamos un escalar clave valor Accediendo al elemento de un hash: $coche{‘marca’} = ‘ford’ identificador (nombre del hash)
  • 10.
  • 11.
    ¿Qué es unhash? La clave puede ser una expresión perl:
  • 12.
    ¿Qué es unhash? La clave puede ser una expresión perl: $coche{$variable}=‘ford’;
  • 13.
    ¿Qué es unhash? La clave puede ser una expresión perl: $coche{$variable}=‘ford’; $coche{ &obtenerClave };
  • 14.
    ¿Qué es unhash? La clave puede ser una expresión perl: $coche{$variable}=‘ford’; $coche{ &obtenerClave }; $coche{ $clave+‘_key’};
  • 15.
    ¿Qué es unhash? La clave puede ser una expresión perl: $coche{$variable}=‘ford’; $coche{ &obtenerClave }; $coche{ $clave+‘_key’}; Al hacer $coch{‘marca’} = ‘ford’
  • 16.
    ¿Qué es unhash? La clave puede ser una expresión perl: $coche{$variable}=‘ford’; $coche{ &obtenerClave }; $coche{ $clave+‘_key’}; Al hacer $coch{‘marca’} = ‘ford’ Si la clave no existe, se crea y se le asigna el valor ‘ford’
  • 17.
    ¿Qué es unhash? La clave puede ser una expresión perl: $coche{$variable}=‘ford’; $coche{ &obtenerClave }; $coche{ $clave+‘_key’}; Al hacer $coch{‘marca’} = ‘ford’ Si la clave no existe, se crea y se le asigna el valor ‘ford’ Si la clave ya existe, se sobreescribe el valor.
  • 18.
    ¿Qué es unhash? La clave puede ser una expresión perl: $coche{$variable}=‘ford’; $coche{ &obtenerClave }; $coche{ $clave+‘_key’}; Al hacer $coch{‘marca’} = ‘ford’ Si la clave no existe, se crea y se le asigna el valor ‘ford’ Si la clave ya existe, se sobreescribe el valor. Si se recupera una clave que no existe, se obtiene undef.
  • 19.
    Definiendo un hash Para referirnos al hash completo utilizamos el símbolo %, igual que para referirnos a un array utilizábamos @ %choche Podemos convertir un hash en una lista y una lista en un hash: 1.%some_hash = ('foo', 35, 'bar', 12.4, 2.5, 'hola', 'wilma', 1.72e30, 'pedro', "adiosn");
  • 20.
    Hash en contextode lista Un hash en contexto de lista es una lista de parejas clave valor 1. @coche = %coche
  • 21.
    Hash en contextode lista ¿Qué hace la siguiente línea de código? 1.%coche_invertido = reverse %coche
  • 22.
    “The Big Arrow” Otra forma de inicializar los hashes en perl 1.my %coche = ( 2. 'marca' => 'ford', 3. 'modelo' => ‘scort’, 4. 'puertas' => 5, 5. 'potencia' => '140cv', 6.);
  • 23.
    Funciones keys Devuelve unalista con las claves de un hash values Devuelve una lista con los valores de un hash
  • 24.
    Ejercicio Escribir una funciónen perl (printHash) que muestre por pantalla un hash con el siguiente formato: clave1 => valor1 clave2 => valor2 clave3 => valor3
  • 25.
    Funciones each Esta funcióndevuelve en cada llamada una pareja clave/valor como una lista de dos elementos Con cada llamada, la función devuelve una nueva pareja clave valor Cuando termina (no quedan más elementos) se devuelve una lista vacía
  • 26.
    Funciones each while ( ($key, $value) = each %hash ) { print "$key => $valuen"; }
  • 27.
    Funciones exists Devuelve verdadero si la clave existe y falso en caso contrario if (exists $coche{"marca"}) { print "Marca: $coche{‘marca’}n"; }
  • 28.
    Funciones delete Elimina una clave del hash (y su correspondiente valor) Si la clave no existe, no da ni error ni warning. my $clave = "modelo"; delete $coche{$modelo};
  • 29.
    El hash %ENV Almacenalas variables de entorno. Escribir un script en perl que lo muestre por pantalla.

Notas del editor

  • #2 \n
  • #3 \n
  • #4 \n
  • #5 \n
  • #6 \n
  • #7 \n
  • #8 \n
  • #9 \n
  • #10 \n
  • #11 \n
  • #12 \n
  • #13 \n
  • #14 \n
  • #15 \n
  • #16 \n
  • #17 \n
  • #18 \n
  • #19 \n
  • #20 \n
  • #21 ver ejemplo hashes1.pl\n\nIndicar que el orden del array es el que más le convenga a perl internamente para almacenar el hash (y además lo hace de forma que no se pueda predecir para evitar posibles ataques)\n
  • #22 ejecutar: hashes2.pl\n
  • #23 Se pueden omitir las comillas de las claves siempre que estas consistan en letras, numeros y guiones bajos.\n
  • #24 \n
  • #25 ver printhash.pl\n
  • #26 \n
  • #27 EJERCICIO: repetir el ejercicio anterior pero con la función each. ver script printhash_each.pl\n\niteración 1: se asigna la primera pareja clave-valor a las variables $ke y $value.\nEl resultado de una asignación en ámbito escalar es el número de elementos que se asignan, en este caso 2. como dos es verdaderos (!=0) se ejecuta el cuerpo del bucle\niteraciones siguientes: se van asignando de esta forma hasta que se termina\ncuando no quedan más elementos para asignar, la asignación de lista en entorno escalar devuelve cero y se sale del buble. Las variables $key y $value valen undef. \n
  • #28 \n
  • #29 No es lo mismo borrar una clave que asignarle un valor undef. Ver script hashes3.pl\n
  • #30 ver env.pl\n