29 septiembre 2007

Jugando con Perl (6)

Otra de las novedades de Perl frente a otros lenguajes "clásicos" es el soporte de "tablas hash", una estructura de datos parecida a los "arrays", pero en la que para acceder a cada elemento no usaremos un número, sino una palabra asociada.

Las variables de tipo "hash" se declaran precediendo su nombre por un símbolo de porcentaje (%). Una primera forma de definirlas, bastante compacta, es ésta:

%edad = ('Juan', 23, 'Pedro', 31);

Para ver la edad de Pedro haríamos

print "La edad de Juan es " . $edad{'Juan'} . "\n";

(cuidado: para acceder a cada dato individual sí se emplea $, y la referencia que buscamos se encierra entre llaves).

Existe otra forma de declarar este tipo de variables, que ocupa más espacio pero puede resultar más legible:

%estatura = (
Juan => 182,
Pedro => 178
);

Así se ve más claramente que son dos pares de datos.

En este caso, también se accedería a cada dato de la misma forma

print "La estatura de Pedro es " . $estatura{'Pedro'} . "\n";

Se puede modificar el valor de una variable de tipo hash así:

$estatura{'Juan'} = 183;

Si usamos este mismo formato con una referencia que no existe, se añadirá a la tabla hash:

$estatura{'Alberto'} = 169;

Podemos borrar un dato con delete:

delete $estatura{'Juan'};

O eliminar todo el hash con "undef":

undef %estatura;


Finalmente, podemos juntar todo esto en un pequeño programa de prueba:

%edad = ('Juan', 23, 'Pedro', 31);
print "La edad de Juan es " . $edad{'Juan'} . "\n";
%estatura = (
Juan => 182,
Pedro => 178
);
print "La estatura de Pedro es " . $estatura{'Pedro'} . "\n";
$estatura{'Juan'} = 183;
print "La estatura de Juan es " . $estatura{'Juan'} . "\n";
$estatura{'Alberto'} = 169;
delete $estatura{'Juan'};
print "La estatura de Juan es " . $estatura{'Juan'} . "\n";
undef %estatura;
print "La estatura de Juan es " . $estatura{'Juan'} . "\n";


En este ejemplo, los dos últimos "print" muestran "La estatura de Juan es" y nada más, porque no hay definido ningún valor que mostrar.

No hay comentarios: