Capítulo 7: Variables que guardan múltiples valores
Tablas Hash
Las tablas Hash son estructuras de datos que almacenan parejas de claves y valores. Como dijimos al principio, también se conocen como diccionarios o arrays asociativos.
De algún modo, podríamos pensar que se trata de arrays donde, en lugar de identificar los diferentes elementos por su posición, se utilizan valores que actúan como índices. Su mayor ventaja es que las claves y los valores pueden ser de cualquier tipo y longitud.
Su sintaxis es parecida a la de los arrays, pero cambiando los paréntesis por llaves y las comas por puntos y comas:
Veamos el array del ejemplo de arriba reinterpretado como tabla Hash:
Igual que hicimos con los arrays, aprovechamos que PowerShell no tiene en cuenta los saltos de línea ni el exceso espacios, para conseguir que nuestro código más legible añadiéndolos según nuestro criterio.
Incluso podemos crear una tabla Hash vacía e ir añadiendo elementos más tarde:
Mostrar el contenido de una tabla Hash
A diferencia de lo que ocurría con los arrays, para que Write-Host consiga mostrar el contenido de una tabla Hash, deberemos canalizar su contenido a través del cmdlet Out-String. Éste convierte la información ofrecida por los objetos de PowerShell en arrays.
Por lo tanto, la sintaxis que usaremos será similar a esta:
También podemos consultar sólo sus claves utilizando la propiedad Keys:
… o sólo los valores, usando la propiedad Values:
Utilizar un elemento individual de la tabla Hash
Para acceder a un elemento concreto de la tabla Hash, basta con escribir su nombre seguido de la clave que necesitamos encerrada entre corchetes. Por ejemplo, para mostrar el primer elemento de la tabla Hash anterior, escribiríamos esto:
También podemos utilizar notación orientada a objetos:
Como puedes ver en la imagen, el resultado que obtenemos es completamente equivalente al de la notación convencional:
Incluso podemos prescindir de las comillas cuando la clave consiste en una sola palabra. Por ejemplo, en el caso de que tuviésemos la siguiente tabla Hash…
Y si lo que queremos es utilizar el elemento dentro de una expresión, nos limitamos a utilizar la notación anterior como si se tratara de una variable simple.
Por ejemplo, para incrementar en uno el valor del elemento, haríamos esto:
o incluso esto:
Tabla Hash como objetos
Como en el caso de los arrays, en las tablas Hash, disponemos de herramientas que nos facilitan su creación, manipulación, búsqueda y ordenación.
Por ejemplo, para obtener el número de pares contenidos en una tabla Hash escribiríamos algo así:
Para conocer en detalle todas las características de la clase Hashtable, puedes recurrir al siguiente enlace: https://msdn.microsoft.com/es-es/library/system.collections.hashtable(v=vs.110).aspx.
Recorrer una tabla Hash
Muchas veces necesitamos realizar operaciones que afecten a todos los elementos de la tabla Hash. Para estas situaciones podemos utilizar la estructura repetitiva foreach.
Por ejemplo, imagina que quieres obtener el precio de los artículos anteriores, después de añadirles un impuesto. El script podría ser parecido a este:
Añadir y quitar elementos en una tabla Hash
Cuando necesitamos que una tabla Hash crezca con nuevos elementos, basta con escribir su nombre seguido de la nueva clave encerrada entre corchetes:
Y para eliminar uno de los elementos, bastaría con escribir:
Por último, si necesitamos eliminar la tabla completa, podríamos utilizar su método Clear:
Actividades resueltas: Trata de resolver las siguientes cuestiones, antes de consultar la respuesta:
-
Escribe un script que contenga una tabla hash donde la clave sean los dígitos del sistema de numeración romano y el valor sea su equivalencia en decimal. La definición será parecida a esta:
$romanos = @{"I"=1; "V"=5; "X"=10; "L"=50; "C"=100; "D"=500; "M"=1000}
El usuario podrá escribir el carácter de cualquier dígito y el script responderá con su valor.
También deberá avisar cuando escribamos un dígito que no exista.
-
Partiendo de la idea anterior, escribe un nuevo script que nos pida un valor y nos responda con el dígito correspondiente en el sistema de numeración romano.
Como antes, avisará cuando no se encuentre el valor aportado.