Los operadores en Perl

En Perl distinguiremos tres tipos de operadores dependiendo de la representación de datos sobre la que queremos actuar. De este manera habrá tres tipos de operadores: los operadores asociados a los escalares, los asociados a los arrays y por último, los vinculados a las listas asociativas.

1. Los operadores asociados a escalares.

Los operadores definidos en Perl tienen todos los operadores estándar (de tipo C) a los que añaden operadores específicos para la manipulación de cadenas de caracteres. Como veremos más adelante la precedencia de estos operadores sigue el mismo criterio que en el lenguaje C.

1.1. Operadores aritméticos.
Perl suministra los siguientes operadores aritméticos.
tabla de operadores aritméticos
Entre los operadores artiméticos también distinguimos los de autoincremento (++) y autodecremento (--). Estos operadores son unarios y se realiza el incremento o decremento de la variable que se le aplica. Además de la acción de modificar la variable devuelven el valor de la variable.
El operador de incremento o decremento puede ir delante o detrás de la variable, teniendo diferente significado. Si el operador ++ se situa después de la variable se denomina postincremento, haciendo que primero se tome el valor y después se incremente la variable. Ejemplo:
$n = $k++;
 # el valor de k se asigna a n y después se incrementa k

Por otro lado, si el operador ++ se sitúa después de la variable se denomina preincremento y hace que primero se incremente la variable y después se tome el valor. Ejemplo:

$n = ++$k;
 # primero se incrementa k y luego se asigna a n

Finalmente, decir que con el operador de decremento se actúa de forma análoga obteniendo así el predecremento y el postdecremento.

1.2. Operadores relacionales.
Perl distingue dos tipos de operadores relacionales: los operadores específicos a valores numéricos y los propios  de las cadenas de caracteres. Estos operadores se resumen en la siguiente tabla:
tabla de operadores relacionales
A parte de los operadores que hay en la tabla cabe distinguir otros operadores únicamente característicos del lenguaje Perl.
'one' cmp 'one'       # devuelve 0
'one dog ' cmp 'one'  # devuelve 1
'dog one' cmp 'one'   # devuelve -1
'two' cmp 'one'       # devuelve -1    
if ($ristra =~ /str/) {
   print $ristra;
}
else {
   print "No se encuentra el patrón";
}
# verifica si 'str' se está en $ristra
if ($ristra !~ /str/) {
   print "No se encuentra el patrón";
}
else {
   print $ristra;
}

1.3. Operadores lógicos.

Los operadores lógicos están relacionados con los relacionales ya que normalmente los operadores que se usan son resultado de expresiones relacionales.

Los valores resultantes son cero o ristra vacía ("") y distinto de cero o ristra vacía  para falso o verdadero respectivamente.

tabla de operadores lógicos

He aquí un ejemplo:

if (($alfa>4) && ($beta<3)) {
   print $alfa * $beta;
   # Sólo entra si se cumplen ambas expresiones.
}
if (($pal1 eq "N") || ($pal1 eq "n") {
   print "La operación no se efectua";
   &salida();
   # Entra si se cumple alguna de las dos expresiones
}
if (!($num < 5)) {
   print "$num es mayor que 5";
   # Entra si la expresión no se cumple
}

1.4. Operador de selección.

Es un operador triario que requiere una condición y dos expresiones. Se utiliza para ejecutar una expresión u otra dependiendo de la condición. Su formato es el siguiente:
                                             Condición? Exp1: Exp2
Si se cumple la condición se evalúa y devuelve la expresión Exp1 si no la Exp2. Por ejemplo:

i = (x<y? 6:k+1); # si x<y entonces i=6, si no i=k+1

1.5. Operadores de asignación.

Una asignación también es un operador que devuelve la variable modificada. El la siguiente tabla veremos los operadores de asignación contenidos en Perl que como se podrá observar son muy parecidos a los del lenguaje C.

tabla de operadores de asignación

A parte de estos operadores Perl posee el operador =~ que también es un operador de asignación, ya que este operador se utiliza dentro de una expresión regular de sustitución para sustituir un patrón de comparación por otra cadena. Ejemplo:

$var =~ s/uno/dos/;
# reemplaza la primera ocurrecia "uno" por "dos" en
# la cadena dada

1.6. Operadores a nivel de bits.

Al igual que C, Perl toma como uno de sus objetivos no alejarse de la máquina, para ello posee esta serie de operadores a nivel de bits.

tabla de operadores a nivel de bits

1.7. El operador ",".

El opearador "," evalúa varias expresiones donde la sintaxis solamante permite una, siendo el valor resultante la última expresión evaluada. La evaluación se realiza de izquierda a derecha. En Perl 5 también se usa el operador => para lo mismo que la coma ",". Ejemplo:

i = (f(3), j+5, k*8, 4/2); # i = 4/2

1.8. Símbolos de puntuación.

Además en Perl tenomos los símbolos de puntuación que a diferencia de otros lenguajes son considerados operadores en Perl. Básicamente tenemos cuatro símbolos que nos permiten agrupar otros símbolos para darles una interpretación especial.

$fecha = "14 de Julio";
print 'hoy es $fecha';  # imprime "hoy es $fecha"
$fecha = "14 de Julio";
print "hoy es $fecha"; 
         # imprime "hoy es 14 de Julio"
print `date`; # ejecuta comando date
if ($var =~/exe/) {
   print $var;
}
  # Se imprime $var si contiene el patrón exe

 1.9. Precedencia de operadores.

Normalmente las expresiones en Perl se evalúan de izquierda a derecha, aunque hay algunas excepciones que es necesario tener en cuenta. No se evalúan de izquierda a derecha los operadores de asignación y el operador de selección. Cuando una expresión tiene diversas posibilidades se aplica el orden de precedencia para establecer el cálaculo a realizar. La precedencia de los operadoes se mostrará en la siguiente tabla, aunque se recomienda emplear paréntesis para que nunca haya duda en el orden de evaluación.

tabla de precedencia de operadores
1.10. Funciones predefinidas para el tratamiento de cadenas de caracteres.
Perl posee una serie de funciones predefinidas que nos facilitan el tratamiento de cadenas de caracteres. Si ellas, realizar operaciones con este tipo de datos sería casi imposible. A continuación nombraremos las funciones básicas para efectuar dicho tratamiento:
$ristra = "hola";
lon = length($ristra); # lon = 2
print "Teclea algo y pulsa enter:\n";
$input = <STDIN>; # $input contiene el "enter"
chop($input);     # $input no lo contiene
$ristra = "El automóvil";
$subristra = "auto";
$pos = index($ristra, $subristra);    # $pos = 4
$pos = index($ristra, $subristra, 6); # $pos = 5
$ristra = "carro y motocarro";
$subristra = "carro";
$pos = rindex($ristra, $subristra); # $pos = 13;
$ristra = "Universidad de Las Palmas de G.C.";
$subristra = substr($ristra,15,10);
# $subristra = "Las Palmas"
$subristra = substr($ristra,15);
# $subristra = "Las Palmas de G.C."

tabla de opciones de pack

Para enteder mejor el funcionamiento de esta función veremos a continuación algunos ejemplos:

$ristra = pack("cccc",65, 66, 67, 68);
# $ristra = "ABCD"
$ristra = pack("c4", 65, 66, 67, 68);
# $ristra = "ABCD"
$ristra = pack("ccxxcc", 65, 66, 67, 68);
# $ristra = "AB\0\0CD"

Esta función, junto con la función hex(valorBase16) que pasa de hexadecimal a entero, son muy útiles para convertir datos procedentes de formularios Web, ya que, en este caso, todos los caracteres de puntación, de control, llegan en formato hexadecimal al servidor y necesitan convertirse en formato ASCII. Esto se haría introduciendo en el programa de conversión y tratamiento de formulario la siguiente línea:

$StringForm =~ s/\%(..)/pack("c",hex($1))/ge;

2. Los operadores asociados a arrays.

2.1. El operador $#.
El operador $# permite delimitar el último índice válido de un array. Este valor norepresenta el tamaño del array, porque esto depende también del índice de base (es decir, el primer elemento del array). Esto se define por la variable $[ cuyo valor predeterminado es 0. Mediante estos dos elementos se puede delimitar el tamaño del array. Por ejemplo, si @A es un array, el código siguiente permite determinar su tamaño:
$n = $#A - $[ + 1;
print "La matriz tiene $n elementos\n";

Los arrays se asignan de manera dinámica y su tamaño se modifica en función de la asignación de nuevos elementos. También es posible asignar el tamaño de memoria necesario antes de utilizar el array. Esto se hace asignado un valor requerido al operador $#. Por ejemplo:

$mes = 11; # el array tiene 12 elemento de 0 a 11

2.2. Los operadores push y pop.

Los operadores push y pop permiten respectivamente insertar y extraer el último elemento de un array. Por ejemplo:

push(@list, $val);      # equivale @list = (@list, $val)
$oldval = pop(@list);   # extrae el último elemento
@list = (1,2,3);     
@five = push(@list, (4,5)); # @five = (1,2,3,4,5)
$num = pop(@list);      # $num = 5

2.3. Los operadores shift y unshift.

Los operadores shift y unshift permiten respectivamente suprimir e insertar el primer elemento de un array. Por ejemplo:

unshift(@list, $val); # equivale a @list = ($val, @list)
unshift(@list, $a, $b, $c);
               # equivale a @list = ($a, $b, $c, @list)
@five = (3,4,5);
unshift(@five,1,2); # @five = (1,2,3,4,5)
$x = shift(@five);  # $x=1, @five=(2,3,4,5)

2.4. Los operadores reverse y sort.

El operador reverse invierte los valores del array mientras que el operador sort los ordena en sentido creciente. Por ejemplo:

@five = (2,3,4,5,1);
sort(@five);          # @five = (1,2,3,4,5)
reverse(@five);       # @five = (5,4,3,2,1)

2.5. Los operadores split y join.

Los operadores split y join permiten transformar una cadena en una lista de caracteres. Por ejemplo, cuando un usuario envía un formulario a un servidor WWW, su contenido se transmite al concatenar pares nombre-valor separados por el símbolo &.  Para acceder a la información transmitida, es necesario descomponer esta cadena de caracteres.

La función split admite tres argumentos, aunque de éstos, el tercero es opcional. El primero de estos argumentos es una expresión regular y el segundo es una cadena de caracteres. La expresión regular define el modelo que deberá descomponer la cadena de caracteres. La sintaxis es la siguiente:

@lista = split(/expresión/, cadena)

donde se representa una expresión regular cualquiera. Por ejemplo:
$datos = "x=3&dbase=Lycos";
@lista = split(/&/, $datos);
foreach $par (@lista) {
   ($nombre, $valor) = split(/=/, $par);
}

Por último, el tercer parámetro consiste en un campo entero que limita el número de campos que divide la lista de caracteres, despreciando los sobrantes, por ejemplo si en él código que acabamos de ver no queremos el campo representado en la variable valor, realizaremos los siguientes cambios.

$datos = "x=3&dbase=Lycos";
@lista = split(/&/, $datos);
foreach $par (@lista) {
   $nombre = split(/=/, $par,1);
}

El operador join realiza la tarea inversa. Así, a partir de un serparador de un lista de valores, concatena los elementos de la lista y la cadena de caracteres que representa el separador. La sintaxis del operador join es la siguiente:

$cadena = join(separador, @lista)
donde el separador representa una cadena de caracteres cualesquiera. Por ejemplo:
@lista = ("x=3", "dbase=Lycos");
$msg = join("&", @lista);        # x=3&dbase="Lycos"

3. Los operadores asociados a listas asociadas.

3.1. El operador keys.
El operador keys proporciona la lista de claves o índice de una lista asociativa. Por ejemplo:
%cuotas = ("root", 10000, "pat", 256);
@list = keys(%cuotas); # @list = ("root", "pat")

3.2. El operador values.

El operador values devuelve los valores de una lista asociativa. Por ejemplo:

%cuotas = ("root", 10000, "pat", 256);
@list = values(%cuotas); # @list = (10000, 256)

3.3. El operador each.

También se puede acceder a una lista asociativa por pares clave-valor, permitiendo el operador each recorrerla iterativamente. El ejemplo siguiente ilustra un acceso a los pares clave-valor una lista asociativa.

%cuotas = ("root", 10000, "pat", 256);
while (($clave, $valor)=each(%cuotas)) {
    print "Login: $clave, Cuota: $valor\n";
}

3.4. El operador delete.

Para suprimer elementos de una lista asociada se usa el operador delete. Este operador permite suprimir un par clave-valor de una lista asociativa. Por ejemplo:

%cuotas = ("root", 10000, "pat", 256);
delete $cuota{"pat"}; #%cuotas = ("root", 10000)
 

&"Iacute;ndice" Operadores de Perl Estructuras de control Tipos de datos