Capítulo 7: Variables que guardan múltiples valores

Publicado por P. Ruiz en

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:

PowerShell-UD07-061

Veamos el array del ejemplo de arriba reinterpretado como tabla Hash:

PowerShell-UD07-038

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:

PowerShell-UD07-039

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:

PowerShell-UD07-040

El resultado será como el que ilustra la imagen siguiente:

PowerShell-UD07-041

También podemos consultar sólo sus claves utilizando la propiedad Keys:

PowerShell-UD07-042

… o sólo los valores, usando la propiedad Values:

PowerShell-UD07-043

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:

PowerShell-UD07-044

Como cabe esperar, el resultado obtenido es como en la siguiente imagen:

PowerShell-UD07-045

También podemos utilizar notación orientada a objetos:

PowerShell-UD07-046

Como puedes ver en la imagen, el resultado que obtenemos es completamente equivalente al de la notación convencional:

PowerShell-UD07-047

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

PowerShell-UD07-048

Lógicamente, el resultado que obtenemos será el valor almacenado en la clave Rojo:

PowerShell-UD07-049

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:

PowerShell-UD07-050

o incluso esto:

PowerShell-UD07-051

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í:

PowerShell-UD07-052

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:

PowerShell-UD07-053

Y ofrecería el siguiente resultado:

PowerShell-UD07-054

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:

PowerShell-UD07-055

También puedes utilizar sintaxis orientado a objetos:

PowerShell-UD07-056

O, incluso…

PowerShell-UD07-057

Y para eliminar uno de los elementos, bastaría con escribir:

PowerShell-UD07-058

Por último, si necesitamos eliminar la tabla completa, podríamos utilizar su método Clear:

PowerShell-UD07-059

Actividades resueltas: Trata de resolver las siguientes cuestiones, antes de consultar la respuesta:

    1. 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.

      Un resultado parecido al de los ejercicios de arrays sería este:

      PowerShell-UD07-066

      Sin embargo, si utilizamos las ventajas que nos ofrecen las tablas Hash, podríamos simplificar algo más el resultado:

      PowerShell-UD07-067

    2. 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.

      PowerShell-UD07-068