Con los arrays hemos visto que podíamos crear listas ordenadas de elementos, y acceder a ellos mediante un índice que indica la posición dentro de la lista. Pero este índice ha de ser siempre un número entero. El problema aparece cuando queremos crear una lista de cosas, pero queramos “apuntar” a ellas conociendo un valor que no sea un número. En ese momento, necesitaremos los hashes.
Un hash, tabla hash o array asociativo es un array donde los elementos son referenciados mediante claves en lugar de índices de posición. Los hashes son útiles entonces, para formar listas o tablas, en las que las referencias no sean forzosamente números enteros.
Un uso clásico de este tipo de variables es la creación de diccionarios. Podemos utilizarlo para crear diccionarios clásicos entre idiomas (si queremos hacer un script que muestre al usuario varios mensajes en varios idiomas), o un diccionario para cualquier otra cosa (traducir hostnames en direcciones IP, nombres de servicios en su protocolo y número de puerto, etc.).
Para los hashes se utiliza el símbolo % delante del nombre de la variable. El contenido de un hash se puede rellenar de varias formas:
my %hash = ( "pera", "verde", "platano", "amarillo" ); my %hash = ( pera => "verde", platano => "amarillo" );
Como en los arrays, también se cambia el % por $ cuando queremos acceder al valor de una posición. En este caso, para indicar la clave cuya posición queremos leer, se indica entre llaves ( { } ).
print $hash{"pera"}; # imprime "verde" $hash{"manzana"} = "rojo"; # añade la pareja manzana/rojo
Se pueden obtener listas con todas las claves o todos los valores del hash, con:
my @fruits = keys %hash; my @colors = values %hash;
Imagen | Michael Coghlan en Flickr