Next Previous Contents

2. Variables en Perl

En Perl hay 3 tipos de variables: escalares, arrays y arrays asociativos (también conocidos como hashes). Los escalares son variables que pueden almacenar enteros, valores en punto flotante o cadenas. Los arrays son grupos ordenados de cualquier otro tipo: escalares, arrays o hashes. Los arrays asociativos son arrays también, pero difieren en que en lugar de tener una clave numérica, un índice como los arrays normales, pueden tener como clave cualquier escalar; y las claves no tienen por qué estar ordenadas, como en un array normal.

2.1 Escalares

Los escalares son las variables más habituales en Perl. Se identifican con un símbolo de dólar antes del nombre: $cosa, $mola1k, $esto_es_un_escalar serían nombres de escalares válidos. Para casi todo, se tratan como en C: la asignación de valores se hace con el signo "igual que", y los valores númericos aceptan los operadores "+=", "*=", "-=" ... que son de uso habitual en C. Por ejemplo:


#!/usr/bin/perl -w

$a = 1;
$b = 2;

$c = $a + $b;
$d = $c * $b;

# Multiplico $b por tres:
$b *= 3;

# Le resto uno a $a:
$a -= 1;

# Incremento $a en uno:

$a++;

# Incremento "prefijo" de $b:

++$b;

Aquí podemos ver comentarios: son las líneas que empiezan por el símbolo de sostenido, "#". La primera línea, en la que especificábamos dónde estaba el intérprete, es la única que se salva de esta regla general.

La sintaxis de los escalares está tomada casi literalmente del lenguaje de scripting más tradicional; por ello, no debe sorprender que en Perl tengan validez muchas de las variables "especiales" que se usan en éste: $$ (el PID del programa que se está ejecutando), $!(el PID del último programa "hijo" invocado por el programa), etc.

Para Perl, una cadena alfanumérica y un entero son lo mismo. Podemos sumar cadenas (aunque si se usa el recomendadísimo parámetro "-w" e intentamos sumar cadenas que no correspondan a valores numéricos, seremos advertidos) y concatenar enteros o valores en punto flotante. Quizás lo más correcto sería decir que para Perl, todos los escalares son cadenas alfanuméricas. Perl es un lenguaje orientado al trabajo con cadenas de texto, y de ahí viene este comportamiento.

Por ejemplo, esto funcionaría como parece evidente, dando un resultado de "3":


#!/usr/bin/perl -w

$a = "1"; $b = 2; $c = $a + $b;

print "$c\n";

Sin embargo, si intentamos hacer los siguiente:


#!/usr/bin/perl -w

$a = "Hola"; $b = 2;

$c = $a + $b;

print "$c\n";

El resultado, sorprendentemente, sería "2"; y antes de mostrarlo, el intérprete nos advertiría de nuestra osadía al intentar una suma tan arriesgada:


Argument "Hola" isn't numeric in add at programa.pl line 5.

Aunque lo que sí podríamos hacer tranquilamente es concatenar un entero con una cadena alfanumérica:


#!/usr/bin/perl -w

$a = "Hola"; $b = 2;

$c = $a . $b;

print "$c\n";

Para concatenar cadenas se usa un punto ("."), como se puede ver. Así, el resultado de ejecutar este programa sería "Hola2".

2.2 Arrays

En Perl, los arrays se denotan por una arroba que precede al nombre. Ejemplos: @lista, @muchos_valores, @fich1. Como en C, los elementos se empiezan a numerar por el 0.

Para asignar valores a un array se pueden usar varios métodos. Podemos asignar varios valores a la vez:


@comandos = ("ls", "cp", "rm", "mv");

También podemos dar valores a elementos individuales del array:


$comandos[2] = "rm";

Como se ve en este ejemplo, cada elemento de un array se denota como si fuera un escalar, es decir: con un símbolo de dólar antes del nombre. Esto es cierto sea el que sea el tipo del elemento del array.

También se pueden hacer arrays de arrays, arrays mixtos, etc.

2.3 Arrays asociativos (hashes)

Los arrays asociativos, o hashes, son arrays cuyo índice puede ser un escalar cualquiera, y que no tienen un orden determinado entre sus elementos. Mientras que un array normal se puede comparar a una lista, un array asociativo se parece más a un conjunto. Se denotan por un símbolo de tanto por ciento antes del nombre, como por ejemplo: %otra_lista, %hash10.

Para dar valores a un array asociativo, debemos asignar un valor tanto al elemento en sí como a su clave. Esto lo hacemos de esta forma:


%musica = ("Joe Satriani", "Surfing With The Alien",
            "Steve Vai", "Passion & Warfare",
            "Eric Johnson", "Venus Isle",
            "Blues Saraceno", "Hairpick");

El primer valor de cada par es la clave; el segundo, el valor del elemento. También habríamos podido dar valores a los elementos individualmente, de esta forma:


$musica{"Joe Satriani"} = "Flying In A Blue Dream";

Como se puede ver, la sintaxis es ligeramente a la de los arrays normales. Aparte de usar "%" en lugar de "@", a la hora de referirnos a un elemento del array encerramos su clave entre llaves, en lugar de corchetes. Como pasa con los arrays normales, el valor de cada elemento (que no su clave) puede ser cualquiera: un escalar, un array, o también otro array asociativo.

Para trabajar con arrays asociativos hay dos operadores fundamentales. Por un lado tenemos keys, que nos devuelve un array con las claves del array asociativo que le indiquemos:


@autores = keys %albumes;

print $autores[2] . "\n";       # Imprimiría "Eric Johnson"

El otro operador es values, que nos devuelve un array con los valores de los elementos del array asociativo:


@albumes = values %musica;

print $albumes[2] . "\n";       # Imprimiría "Venus Isle"


Next Previous Contents