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.
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 kPor 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 nFinalmente, 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:
A parte de los operadores que hay en la tabla cabe distinguir otros operadores únicamente característicos del lenguaje Perl.
- cmp. Este operador es utilizado para comparar caracteres, de manera que, retorna 0 si los caracteres comparados son iguales, 1 si la cadena de la derecha se encuentra al comienzo de la de la izquierda, y -1 en el caso contrario. Para aclarar el funcionamiento de este operador he aquí un ejemplo:
'one' cmp 'one' # devuelve 0
'one dog ' cmp 'one' # devuelve 1
'dog one' cmp 'one' # devuelve -1
'two' cmp 'one' # devuelve -1
- <=>. Este operador se utiliza para comparar valores numéricos, retornando 0 cuando son iguales, 1 cuando el termino de la derecha es menor que el de la izquierda y -1 en el caso contrario.
- =~. Este operador es usado en las expresiones regulares para indicar la presencia de un patrón de compración dentro de una variable que contiene una cadena de caracteres. Por ejemplo:
if ($ristra =~ /str/) {
print $ristra;
}
else {
print "No se encuentra el patrón";
}
# verifica si 'str' se está en $ristra
- !~.Meditante este operador se verifica la no existencia del patrón de búsqueda en una cadena. He aquí un ejemplo:
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.
![]()
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+11.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.
![]()
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 dada1.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.
![]()
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/21.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.
- ' '. Especifica valores literales. No hace sustituciones. Ejemplo:
$fecha = "14 de Julio";
print 'hoy es $fecha'; # imprime "hoy es $fecha"
- " ". Especifica valores literales. Realiza sustituciones. Ejemplo:
$fecha = "14 de Julio";
print "hoy es $fecha";
# imprime "hoy es 14 de Julio"
- ` `. Ejecuta el comando contenido haciendo las sustituciones indicadas. Igual que muchos Shells de Unix. Por Ejemplo:
print `date`; # ejecuta comando date
- / /. Delimita expresiones regulares. Ejemplo:
if ($var =~/exe/) {
print $var;
}
# Se imprime $var si contiene el patrón exe1.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.
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:
- length(cadena de caracteres). Esta función nos permite conocer la longitud de una cadena de caracteres. Por ejemplo:
$ristra = "hola";
lon = length($ristra); # lon = 2
- chop(cadena de caracteres). Elimina el último carácter de la ristra y retorna dicho carácter. Esta función se suele usar para eliminar el carácter de nueva línea que contienen las ristras que se introducen por teclado o se leen de un fichero. Ejemplo:
print "Teclea algo y pulsa enter:\n";
$input = <STDIN>; # $input contiene el "enter"
chop($input); # $input no lo contiene
- index(ristra, subristra, [posición]). Esta función retorna la posición de la primera ocurrencia de la subristra en la ristra indicada. El parámetro posición indica el número de caracteres desde el inicio que se deben ignorar en la búsqueda. Si se omite este parámetro se considera que no se desea ignorar ningún carácter, es decir, se considera posición igual a 0. Si no se encuentra la subristra la función devuelve la posición desde la que comienza a buscar -1, esto es, el parámetro posición menos 1. Ejemplo:
$ristra = "El automóvil";
$subristra = "auto";
$pos = index($ristra, $subristra); # $pos = 4
$pos = index($ristra, $subristra, 6); # $pos = 5
- rindex(ristra, subristra, [posición]). Esta posición trabaja igual que index salvo que retorna de la última ocurrencia de la subristra en la ristra. Posición es el número de caracteres desde el inicio que se ignorá en la búsqueda. Si no se encuentra posición, el valor retornado es posición menos 1. Ejemplo:
$ristra = "carro y motocarro";
$subristra = "carro";
$pos = rindex($ristra, $subristra); # $pos = 13;
- substr(ristra, desplazamiento, [longitud]). Esta función extrae una subristra de la ristra dada, desde la posición indicada por desplazamiento hasta el número de caracteres indicado por longitud. Si el parámetro longitud se omite se tomará la subristra que va desde el parámetro desplazamiento hasta el final de la ristra. Considerar que el primer carácter de una ristra es el que esta en la posición cero. Ejemplo:
$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."
- pack("tipos a convertir", valores a convertir). La función pack es un convertidor de tipos que ofrece en su primer parámetro varias opciones de conversión para convertir el tipo de la lista de valores que se dan en el segundo parámetro a caracter ASCII. A continuación se muestran las tipos de conversión más usados:
![]()
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 112.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 = 52.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)