Troceado de un hash

Es posible seleccionar un sub-hash utilizando la notación que aparece en este ejemplo:
hp@nereida:~/public_html/cgi-bin/tt$ perl -wde 0
main::(-e:1):   0
  DB<1> %a = (x => 5, y => 3, z => "woof", t => undef)
  DB<2> print @a{"y", "z"}
3woof
  DB<3> print @a{qw(y z) }
3woof
  DB<4> print @a{y, z}
Transliteration pattern not terminated at (eval 8)
Dos observaciones:
  1. Puesto que la lista de claves no es un único identificador se hace conveniente el uso de comillas
  2. El prefijo del trozo de un hash es @. El símbolo % se reserva para el hash completo. Un trozo de un hash es la lista de valores para las claves especificadas. No es un escalar (hay varios elementos) ni un hash (no ha claves)

Observe también el símbolo al comienzo de la variable (dolar o arroba) determina el contexto (escalar o lista) en el que se evalúa la expresión que indexa.

Al usar un trozo de un hash en el lado izquierdo se obtiene el efecto esperado:

@a{"y", "z"} = ("andale, andale!", 7.2); 
@a = %a;
print "@a\n";

La asignación @a{"y", "z"} = ("andale, andale!", 7.2) es equivalente a la asignación ($a{y}, $a{z}) = ("andale, andale!", 7.2).

Algunos otros ejemplos:

@char_num{'A'..'Z'} = 1..26; # crea un hash con claves 'A' .. 'Z' 
@old{keys %new} = values %new; # Escribe/extiende los contenidos de %new sobre %old
delete @name{keys %invalid}; # Suprime los elementos en %invalid de %name
Reflexione: ¿Porqué @name en el último ejemplo?

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19