Sie sind auf Seite 1von 40

Tutorial de Perl

1. Introduccin al Perl.

2. La sintaxis de Perl.

3. Tipos de datos.

4. Operadores.

5. Estructuras de control.

6. Expresiones regulares.

7. Creacin de funciones.

8. Entrada / salida.

9. Variables predefinidas.

Introduccin al Perl
1. Qu es Perl? Perl (Practical Extraction and Report Languaje) es un lenguaje creado a principio de los noventa por Larry Wall, el cual lo realiz casi como una obra altruista, por eso, su distribucin es gratuita. Perl es un lenguaje pensado para la manipulacin de cadenas de caracteres, archivos y procesos. Esta manipulacin se va simplificada por el importante nmero de operadores a disposicin del usuario. El lenguaje Perl se percibe habitualmente como un lenguaje intermedio entre los shell scripts y la programacin en C. En efecto, los programas en Perl son una sucesin de instrucciones y son similares a los shell scripts porque no existe un procedimiento principal como la subrutina main en C. Sin embargo, se parece al lenguaje C en su sintaxis y en el nmero importante de funciones que permiten la manipulacin de cadenas de caracteres y archivos. El lenguaje Perl no es precompilado, pero an as es ms rpido que la mayoria de lenguajes interpretados, en especial que el Bourne Shell. Esto se debe a que los programas en Perl son analizados, interpretados y compilados por el interprete perl antes de su ejecucin. Estas caractersticas hacen que el mantenimiento y la depuracin de un programa en Perl sean mucho ms sencilla que el mismo programa escrito en C. Por todo esto, Perl es un lenguaje muy utilizado en los dos campos siguientes: 1. La administracin de sistemas operativos. Debido a sus caractersticas Perl es muy potente en la creacin de pequeos programas que pueden ser usados como filtros para obtener informacin de ficheros, realizar bsquedas, etc. Adems, aunque Perl naci en un entorno Unix, hay versiones para casi todas las plataformas existentes. 2. La creacin de formularios en la Web. Es decir, se utilizan para la creacin de scripts CGI (Common Gateway Interface). Estos scripts realizan el intercambio de informacin entre aplicaciones externas y servicios de informacin, es decir, se encargan de tratar y hacer llegar la informacin que el cliente WWW manda al servidor a travs de un formulario.

2. Acerca de las versiones de Perl. Actualmente existen dos versiones altamente populares de Perl, la 4.3 y la 5.0, de hecho hay diferencias importantes entre una versin y otra. Seguramente el lector se pregunta porque surge la duda entre usar una versin vieja y una nueva, por regla general las nuevas versiones son mejores que las anteriores de modo que las opacan en todo sentido, Perl no es la excepcin a esta regla, el nico factor que impide una transicin inmediata es que no son 100% compatibles. La versin 5 de Perl es una reescritura total que ya incluye un manejo de estructuras abstractas de datos mucho mas poderoso, incluso, soporta la orientacin a objetos a su manera (lo que rompe en gran medida con la filosofa tradiconal de Perl de una programacin ms parecida a los Shells de Unix que al modular lenguaje C). De modo que las libreras, por ejemplo para creacin de CGIs no funcionan de una funcin a otra por lo que la migracin es poco practica. En este tutorial seguiremos la filosofa tradicional de Perl y no nos adentraremos en la orientacin a objetos.

La sintaxis de Perl
1. Un lenguaje interpretado. Como sabemos Perl es un lenguaje interpretado, en consecuencia para ejecutar un script en Perl debemos indicarle al sistema en ese mismo instante el interprete que vamos a utilizar para ejecutar dicha script en Perl. Esto se puede realizar de dos formas: 1. Insertando en la primera lnea del archivo la instruccin: #!/usr/local/bin/perl. Esta sentencia indica al sistema operativo que lo que sigue es un script de Perl y que perl es el programa con el que debe ejecutarse. Dicho programa est en /usr/local/bin. Por tanto la secuencia !# es reconocida por Unix no por Perl. 2. Especificando el intrprete desde la lnea de comando: perl script.pl. Vemos como directamente se ejecuta el interprete de Perl pasando como primer paramtro el script a ejecutar. En el caso de haber ms parmetros, stos se tomarn como parmetros del programa. As slo nos queda saber que para ejecutar un script, el fichero que lo contiene en este caso script.pl debe tener permiso de ejecucin al menos slo desde el punto de vista del usuario. Para saber los permisos que contiene un fichero en el sistema operativo Unix basta simplemente con teclear el siguiente comando: ls -l. Si cuando tecleamos esto y vemos que no tiene permiso de ejecucin, utilizaremos el siguiente comando para darle dicho permiso: chmod 700 script.pl. De esta manera, slo podremos leer, escribir y ejecutar el archivo nosotros como usuarios del mismo. 2. El intrprete de Perl. Como ya hemos dicho en el captulo anterior, una de las maneras de ejecutar un script de Perl era ejecutando dicho script como un parmetro de un interprete de Perl determinado. Pues bien, dicho intrprete posee ciertas opciones que nos proporcionan o bien informacin sobre el mismo, o bien ciertas facilidades a la hora de ejecutar los script como se podr ver a continuacin. ?? perl -v : Muestra la versin del intrprete de Perl que estamos utilizando. ?? perl -V : Muestra informacin sobre la configuracin del intrprete de perl. ?? perl -e expresin : Ejecuta la expresin como si sta fuera un programa de una lnea. Por ejemplo: perl -e "print 'hola a todos\n';" ?? perl -ne expresin : Ejecuta la expresin como si est fuera un bucle repetitivo. He aqu un ejemplo: perl -ne "print if /M+/;" usuarios.txt . Este ejemplo extrae todos los usuarios cuyo nombre empieze por la letra M. ?? perl -d script : Ejecuta el script bajo el depurador. ?? perl -w script : Da avisos sobre las contrucciones con errores. ?? perl -pe expresin : Ejecuta la expresin como si est fuera un bucle repetitivo y adems imprime cada lnea. He aqu un ejemplo: perl -pe "print if /M+/;" usuarios.txt . Observar diferencia con la opcin -ne. La diferencia es que mientras la primera versin slo imprima los nombres que empezaban por M, la segunda por su parte imprima todos los nombre una vez salvo los que empiezan por M que los imprime dos veces. ?? perl -x script : Empieza a interpretar el fichero que contiene el script cuando encuentra la referencia al intrprete, por ejemplo: #!/usr/bin/perl. ?? perl -i archivo : Permite editar archivos. Por ejemplo, si ejecutamos lo siguiente sobre la lnea de comandos: perl -p -i -e "s/\$seg/\$segundos/g;" tiempo.pl. Esta orden cambiar el nombre de la variable $seg por $segundos en el script contenido en el fichero tiempo.pl.

3. El primer programa en Perl. Un script en Perl es una sucesin de instrucciones. stas se delimitan por punto y coma (;). Los comentarios en los scripts deben ir precedidos por el smbolo #. Los caracteres que siguen a este smbolo y que est contenidos en la misma lnea se consideran comentarios y se ignoran. El siguiente script muestra la cadena de caracteres "Hola, mundo!". Este script se llamar hola.pl y contendr las siguientes lneas. #!/usr/local/bin/perl print "Hola, mundo!"; Una vez que hayamos verificado los permisos de dicho script estaremos listos para ejecutarlo simplemente tecleando en la lnea de comandos: hola.pl. Por ltimo hacer notar que lo de la extensin .pl es simplemente una formalidad y que nos es absolutamente necesario que el fichero que contenga nuestro script lleve dicha notacin.

Los tipos de datos


1. Los tipos bsicos de datos b sicos. Perl permite representar los tipos de datos bsicos como son los reales, los enteros, las cadenas de caracteres y el tipo booleano. 1.1. Los tipos numricos (reales y enteros). Los valores numricos espresados literalmente se presentan en forma de valores reales codificados en doble precisin. Este formato interno se utiliza para todas las operaciones aritmticas. Por ejemp lo: $x $y $n $i = = = = 0.897; 6.23e-24; 567; -234; # # # # un un un un real real entero entero

Nota: El que todas las variables contengan un $ significan que representan un escalar. Esto lo veremos en el siguiente apartado. Los valores enteros no pueden empezar por cero porque esto permite especificar un entero mediante su codificacin octal o hexadecimal. El cdigo octal se antecede con en cero 0; el cdigo hexadecimal se antecede con un 0x o 0X. Por ejemplo: $x = 0377; $y = 0xff; 1.2. Las cadenas de caracteres. Las cadenas de caracteres se especifican literalmente por medio de un sucesin de caracteres delimitada por comillas ("..") o apstrofes ('..'). Estas dos representaciones se distinguen por la interpretacin hecha por Perl de las cadenas de caracteres. Cuando van # equivale a 255 # equivale a 255

delimitadas por comillas (".."), toda variable referenciada en el interior de la cadena se evala y se reemplaza por su valor. Por ejemplo, las instruciones siguientes: $wld = "mundo"; $str = "Hola $wld!"; asignan al escalar la cadena de caracteres "Hola mundo!". Por el contrario, las cadenas de caracteres delimitadas por apstrofes se dejan intactas. Por ejemplo: $str = 'Hola $wld!'; asigna al escalar $str la cadena de caracteres "Hola $wld!". Existe una tercera sintaxis que permite delimitar una cadena de caracteres. Se utiliza cuando la cadena de caracteres contiene varias lneas y/o comillas o apstrofes. Su sintaxis es la siguiente: $str = <<etiqueta; .... etiqueta donde la etiqueta es una cadena de caracteres cualquiera. El fin de la cadena se determina por la nueva lnea que contiene nicamente el identificador. ste no debe ir precedido por un espacio ni marca de tabulacin. Por ejemplo: $msg = <<SALUDO; hola, buenos das, adios, SALUDO 1.3. El tipo booleano. El tipo booleano existe, al igual que en C, de modo implcito, es decir, un nmero es falso si es igual a cero y verdadero en cualquier otro caso. Como el cero est asociado a la ristra vaca (""), sta tambin equivale al valor falso. 2. Las representaciones de datos. El lenguaje Perl posee tres tipos de representaciones de datos: ?? los escalares. ?? los arrays. ?? los arrays de indexacin literal o listas asociadas. Estas tres representaciones permiten asociar a cada variable utilizada un tipo. Por otra parte, las variables Perl no tienen que declararse antes de su uso. Se asignan de manera dinmica y se les asigna un valor predeterminado en funcin del contexto. 2.1. Los escalares. El escalar representa el tipo bsico en Perl. Permite representar enteros, reales y cadenas de caracteres. Las variables de tipo escalar van precedidas por el smbolo $. A continuacin veremos algunos ejemplos:

$real = 4.53; $entero = -45; $ristra = "Hola"; Las variables en Perl se asignan de manera dinmica y se les asigna un valor predeterminado en funcin del contexto. En un contexto numrico el valor predeterminado es 0, mientras que en un contexto de cadena de caracteres el valor predeterminado es la cadena vaca "". Como ya hemos dicho, cuando una cadena de caracteres se delimita por comillas, el contenido de esta cadena es analizado por Perl para el reemplazo eventual por su valor de las variables escalares identificadas por el smbolo $. Este anlisis se denomina interopolacin de variables y puede evitarse poniendo delante del smbolo $ una barra oblicua inversa \ o delimitando la cadena de caracteres con apstrofes. He aqu un ejemplo: $adr = $msg = "\n"; $msg = $msg = $msg = "www"; "El servidor web ${adr}.ulpgc.es"; print $msg, "El servidor web $adr.ulpgc.es"; print $msg, "\n"; "El servidor web \$adr.ulpgc.es"; print $msg, "\n"; 'El servidor web $adr.ulpgc.es'; print $msg, "\n";

Observe la contruccin ${...} para referenciar el nombre de una variable en una cadena de caracteres. Si lo hubieramos omitido, el ejemplo anterior habra hecho referencia a la variable $adr.ulpgc.es no definida. El tipo y el valor de las variables en Perl se determina a partir del contexto. As, una cadena de caracteres conteniendo un valor numrico ser convertida en variable numrica en un contexto numrico. Consideremos el cdigo siguiente: $x = 4.1; # un real $y = "11"; # una cadena de caracteres $z = $x + $y; # adicin de dos valores numricos $t = $x . $y; # concatenacin de dos cadenas print $z, "\n", "$t \n"; Al final del cdigo la variable $z tiene el valor 15.1. Por otro lado, la variable $t contiene el valor "4.111". Por lo tanto en Perl no es necesario realizar una declaracin de tipos, ni es necesario el operador cast, ni tampoco es necesario dar formato a los valores a la hora de imprimirlos como ocurra en C. Esta interpolacin se produce a menudo en unas lneas de cdigo tales como las siguientes: $year = 35; print "Tengo $year aos"; El resultado de estas lneas de cdigo es: "Tengo 35 aos"; el contenido de la variable year se ha convertido en una cadena de caracteres. 2.2. Los arrays. Un array es una lista de datos de tipo escalar. Cada elemento de la lista es una variable escalar a la que se le asocia un valor. Las variables de tipo array se identifican por el prefijo arroba @. Por ejemplo:

@numeros = (2, 1, 667, 23, 2.2, 5, 6); @letras = ("perro", "gato", "len"); @mezcla = ("hola", 23, "adios", 31.234); Tambin se permite definir los elementos de un array a partir de sus valores extremos como se muestra a continuacin: @alfabeto = (a..z); Los elementos de un array se referencian mediante ndices. El primer elemento se referencia por el ndice 0. Por ejemplo: $numero[4]; $letras[2]; $mezcla[0]; # vale 2.2 # vale "len" # vale "hola"

Tambin se puede acceder a un array mediante el operador que define una horquilla de ndices. Por ejemplo: @num1 = @numeros[1..3]; 23) @str = @letras[0,2]; "len") ($ristra, $num) = @mezcla; "hola", $num = 23 # @num1 = (1, 667, # @str = ("perro", # $ristra =

Esta ltima instruccin vemos que permite asignar los dos primeros valores del array @mezcla a las variables escalares $ristra y $num. Por otro lado, el acceso a un array fuera de rango devuelve un valor indefinido 0 o "" segn el contexto. Por ltimo, si vemos las siguientes lneas de cdigo: @a=(1,2,3); @b=(5,6,7); @c=(@a,4,@b,8); Estas expresiones generan tres arrays, (1,2,3), (5,6,7) y (1,2,3,4,5,6,7,8), y no, como podra pensarse un array de arrays, cuando incluimos un array dentro de otro, Perl "aplana" el array insertado uno a uno todos sus elementos en la posicin indicada del array que ha de contenerlos, para hacer array de arrays deberemos usar referencias a estos. Como veremos en el apartado 4 de este captulo. 2.3. Las listas asociativas (arrays de indexacin literal). Una lista asociativa est indexada por cadenas en lugar de por nmeros. Se utiliza % para definir el tipo de lista asociativa y un elemento est indexado por el anterior formando ambos parejas del tipo (clave, valor). %cuota = ("root", 1000, "pat", 256, "fiona", 4000); En este caso, para acceder a cualquiera de los elementos de %cuota debemos conocer su clave. Por ejemplo: $id = $cuota{"pat"}; # $id = 256

Esta lista puede completarse aadiendo nuevos valores y asociando a cada clave el valor correspondiente. Por ejemplo: $cuota{"dave"} = 250; donde la clave es "dave" y el valor asociado es 250. 3. Los identificadores de las variables. En cuanto a las ristras de caracteres que representan a nuestras variables decir que los caracteres permitidos son las letras, dgitos y el carcter underscore (_). Las letras maysculas y minsculas son diferenciadas en los nombres de variables. Los nombre de las variables siempre deben comenzar por una letra. Se recomienda que los nombre de las variables estn en consonancia con lo que ellas representan, sin embargo estos tampoco deben ser demasiado largos. 4. Las referencias. Las referencias son el equivalente a los punteros en C. Es un tipo de datos que permite referenciar datos contenidos en otra entidad. No forman una nueva representacin de datos, ya que stos son tratados como un tipo ms de escalar. La definicin de referemcia se usa mediante el operador de referencia backslash ("\"). No existe un operador de desrreferencia. A diferencia de C, Perl no deja "huella" de las referencias en memoria sino que tiene un mecanismo de "papelera de reciclaje" que consis te en un registro que posee las diversas referencias a cada elemento en memoria y las destruye cuando descubre que nadie hace referencia a l. 4.1. Creacin de referencias. Podemos crear una referencia usando un operador de referenciacin en una variable o un valor. En el caso de la variable es crear un medio alternativo de acceder al valor de la variable. $rescalar = \$escalar; $rarreglo = \@arreglo; $rhash = \%hash; Por otro lado, cuando usamos el operador de referenciacin con un valor, creamos objetos annimos que slo pueden ser accedidos por medio de la referencia. $rescalar=\"hola"; #referencia a la cadena annima "hola" $rarray=[1,2,3]; #referencia al array annimo (1,2,3) $rlista={"llave1" => "dato1","llave2" => "dato2"}; Nota: En esta representacin usamos el operador "=>" para la representacin de listas asociativas annimas. De esta manera se pueden construir estructuras de datos ms complejas como se ve en el siguiente ejemplo: %rNumeros = {"arabes" => [1,2,3], "romanos" => [I, V, X]}

El ejemplo que acabamos de ver forma una lista asociativa annima donde las claves son cadenas de caracteres y los valores son referencia a arrays. 4.2. Uso de referencias. A continuacin se dar la forma de acceder a las referencias y modifiar su valor. Como veremos en el ejemplo que viene a continuacin para acceder al valor referenciado se usa el operador $ por duplicado. $nombre="entero"; $entero=5; $rentero=\$entero; $$nombre=6; $$rentero=7;

Como se puede ver en este ejemplo cambia el valor de $entero de 5 a 6 y despus de 6 a 7. A continuacun veremos el uso de las referencias a arrays y listas asociativas. $rarray=[1,2,3,4] #crea arreglo annimo (1,2,3,4) $$rarray[2]="tres"; #modifica el array annimo a (1,2,"tres",4) @$rarray=(); #limpia el arreglo annimo Como forma de abreviar la referencia a listas asociativas o arrays se aadi en operador "->". A continuacin veremos un ejemplo de uso del mismo. $rarray->[2]="hola"; # Coloca "hola" como 3 elemento del array referenciado $rlista->["clave1"]="valor1"; # Coloca el par ("clave1" => "valor1") Se pueden realizar referencias a referencias y arreglos a referencias de forma que los arryas multidimensionales se pueden hacer con la misma facilidad que en C. Ejemplo: $array3d->[0]->[0]->[0]=1; # Forma abreviada: $array3d[0][0][0]=1; # Tambin se puede usar $array3d->[0][0][0]=1;

Los operadores en Perl


En Perl distinguiremos tres tipos de operadores dependiendo de la representacin 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 estndar (de tipo C) a los que aaden operadores especficos para la manipulacin de cadenas de caracteres. Como veremos ms adelante la precedencia de estos operadores sigue el mismo criterio que en el lenguaje C. 1.1. Operadores aritmticos. Perl suministra los siguientes operadores aritmticos.

Entre los operadores artimticos tambin distinguimos los de autoincremento (++) y autodecremento (--). Estos operadores son unarios y se realiza el incremento o decremento de la variable que se le aplica. Adems de la accin de modificar la variable devuelven el valor de la variable. El operador de incremento o decremento puede ir delante o detrs de la variable, teniendo diferente significado. Si el operador ++ se situa despus de la variable se denomina postincremento, haciendo que primero se tome el valor y despus se incremente la variable. Ejemplo: $n = $k++; # el valor de k se asigna a n y despus se incrementa k Por otro lado, si el operador ++ se sita despus de la variable se denomina preincremento y hace que primero se incremente la variable y despus 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 acta de forma anloga obteniendo as el predecremento y el postdecremento. 1.2. Operadores relacionales.

Perl distingue dos tipos de operadores relacionales: los operadores especficos a valores numricos 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 caractersticos 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 numricos, 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 patrn de compracin dentro de una variable que contiene una cadena de caracteres. Por ejemplo: if ($ristra =~ /str/) { print $ristra; } else { print "No se encuentra el patrn"; } # verifica si 'str' se est en $ristra ?? !~.Meditante este operador se verifica la no existencia del patrn de bsqueda en una cadena. He aqu un ejemplo: if ($ristra !~ /str/) {

print "No se encuentra el patrn"; } else { print $ristra; } 1.3. Operadores lgicos. Los operadores lgicos estn relacionados con los relacionales ya que normalmente los operadores que se usan son resultado de expresiones relacionales. Los valores resultantes son cero o ristra vaca ("") y distinto de cero o ristra vaca para falso o verdadero respectivamente.

He aqu un ejemplo: if (($alfa>4) && ($beta<3)) { print $alfa * $beta; # Slo entra si se cumplen ambas expresiones. } if (($pal1 eq "N") || ($pal1 eq "n") { print "La operacin 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 expresin no se cumple } 1.4. Operador de seleccin. Es un operador triario que requiere una condicin y dos expresiones. Se utiliza para ejecutar una expresin u otra dependiendo de la condicin. Su formato es el siguiente: Condicin? Exp1: Exp2 Si se cumple la condicin se evala y devuelve la expresin 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 asignacin. Una asignacin tambin es un operador que devuelve la variable modificada. El la siguiente tabla veremos los operadores de asignacin 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 tambin es un operador de asignacin, ya que este operador se utiliza dentro de una expresin regular de sustitucin para sustituir un patrn de comparacin 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 mquina, para ello posee esta serie de operadores a nivel de bits.

1.7. El operador ",". El opearador "," evala varias expresiones donde la sintaxis solamante permite una, siendo el valor resultante la ltima expresin evaluada. La evaluacin se realiza de izquierda a derecha. En Perl 5 tambin 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. Smbolos de puntuacin.

Adems en Perl tenomos los smbolos de puntuacin que a diferencia de otros lenguajes son considerados operadores en Perl. Bsicamente tenemos cuatro smbolos que nos permiten agrupar otros smbolos para darles una interpretacin 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 patrn exe 1.9. Precedencia de operadores. Normalmente las expresiones en Perl se evalan de izquierda a derecha, aunque hay algunas excepciones que es necesario tener en cuenta. No se evalan de izquierda a derecha los operadores de asignacin y el operador de seleccin. Cuando una expresin tiene diversas posibilidades se aplica el orden de precedencia para establecer el claculo a realizar. La precedencia de los operadoes se mostrar en la siguiente tabla, aunque se recomienda emplear parntesis para que nunca haya duda en el orden de evaluacin.

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 sera casi imposible. A continuacin nombraremos las funciones bsicas para efectuar dicho tratamiento: ?? length(cadena de caracteres). Esta funcin 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 carcter de la ristra y retorna dicho carcter. Esta funcin se suele usar para eliminar el carcter de nueva lnea 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, [posicin]). Esta funcin retorna la posicin de la primera ocurrencia de la subristra en la ristra indicada. El parmetro posicin indica el nmero de caracteres desde el inicio que se deben ignorar en la bsqueda. Si se omite este parmetro se considera que no se desea ignorar ningn carcter, es decir, se considera posicin igual a 0. Si no se encuentra la subristra la funcin devuelve la posicin desde la que comienza a buscar -1, esto es, el parmetro posicin menos 1. Ejemplo: $ristra = "El automvil"; $subristra = "auto"; $pos = index($ristra, $subristra); # $pos = 4 $pos = index($ristra, $subristra, 6); # $pos = 5

?? rindex(ristra, subristra, [posicin]). Esta posicin trabaja igual que index salvo que retorna de la ltima ocurrencia de la subristra en la ristra. Posicin es el nmero de caracteres desde el inicio que se ignor en la bsqueda. Si no se encuentra posicin, el valor retornado es posicin menos 1. Ejemplo: $ristra = "carro y motocarro"; $subristra = "carro"; $pos = rindex($ristra, $subristra); # $pos = 13; ?? substr(ristra, desplazamiento, [longitud]). Esta funcin extrae una subristra de la ristra dada, desde la posicin indicada por desplazamiento hasta el nmero de caracteres indicado por longitud. Si el parmetro longitud se omite se tomar la subristra que va desde el parmetro desplazamiento hasta el final de la ristra. Considerar que el primer carcter de una ristra es el que esta en la posicin 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 funcin pack es un convertidor de tipos que ofrece en su primer parmetro varias opciones de conversin para convertir el tipo de la lista de valores que se dan en el segundo parmetro a caracter ASCII. A continuacin se muestran las tipos de conversin ms usados:

Para enteder mejor el funcionamiento de esta funcin veremos a continuacin algunos ejemplos: $ristra = 68); # $ristra $ristra = 68); # $ristra $ristra = pack("cccc",65, 66, 67, = "ABCD" pack("c4", 65, 66, 67, = "ABCD" pack("ccxxcc", 65, 66,

67, 68); # $ristra = "AB\0\0CD" Esta funcin, junto con la funcin 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 puntacin, de control, llegan en formato hexadecimal al servidor y necesitan convertirse en formato ASCII. Esto se hara introduciendo en el programa de conversin y tratamiento de formulario la siguiente lnea: $StringForm =~ s/\%(..)/pack("c",hex($1))/ge; 2. Los operadores asociados a arrays. 2.1. El operador $#. El operador $# permite delimitar el ltimo ndice vlido de un array. Este valor norepresenta el tamao del array, porque esto depende tambin 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 tamao del array. Por ejemplo, si @A es un array, el cdigo siguiente permite determinar su tamao: $n = $#A - $[ + 1; print "La matriz tiene $n elementos\n"; Los arrays se asignan de manera dinmica y su tamao se modifica en funcin de la asignacin de nuevos elementos. Tambin es posible asignar el tamao 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); reverse(@five); 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 enva un formulario a un servidor WWW, su contenido se transmite al concatenar pares nombre-valor separados por el smbolo &. Para acceder a la informacin transmitida, es necesario descomponer esta cadena de caracteres. La funcin split admite tres argumentos, aunque de stos, el tercero es opcional. El primero de estos argumentos es una expresin regular y el segundo es una cadena de caracteres. La expresin regular define el modelo que deber descomponer la cadena de caracteres. La sintaxis es la siguiente: @lista = split(/expresin/, cadena) donde se representa una expresin regular cualquiera. Por ejemplo: $datos = "x=3&dbase=Lycos"; @lista = split(/&/, $datos); foreach $par (@lista) { ($nombre, $valor) = split(/=/, $par); } Por ltimo, el tercer parmetro consiste en un campo entero que limita el nmero de campos que divide la lista de caracteres, despreciando los sobrantes, por ejemplo si en l cdigo 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:

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

@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. Tambin 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)

Estructuras de control
El desarrollo de un programa viene determinado por el orden en que aparecen las instrucciones. El lenguaje Perl posee controlar un conjunto de instrucciones que permiten controlar el desarrollo de un programa. Estas instrucciones se denominan estructuras de control porque permiten ejecutar un conjunto de instrucciones cuando se verifica una condicin o ejecutar iterativamente un bloque de instrucciones mientras una expresin sea vlida. 1. La instruccin if. Es muy parecida a la utilizada en C. La sintaxis de la instruccin if es la siguiente: if (expresin) { instruccin o bloque de intrucciones 1; } [else { instruccin o bloque de intrucciones 2; } ] El programa evala la expresin. Cuando esta expresin resulta verdadera, se ejecuta la instruccin o el bloque de instrucciones 1. Por contra, cuando es falsa de ejecuta la instruccin o bloque de instrucciones 2. Esta ltima parte es opcional. Para representar una estructura de varios casos se utilizar la sintaxis siguiente: if (expresin 1) { instruccin o bloque de instrucciones 1; } elsif (expresin 2) { instruccin o bloque de instrucciones 2; } elsif (expresin 3) { instruccin o bloque de instrucciones 3; } else { intruccin o bloque de instrucciones 4; } A continuacin veremos un ejemplo sencillo del uso de esta estructura para comprender mejor su funcionamiento: print "Introduzca un nmero del cero al dos y pulse Enter:\n"; $var = <STDIN>; if ($var == 0) { print "Esta es la opcin 0\n"; } elsif ($var == 1) { print "Esta es la opcin 1\n"; } elsif ($var == 2) { print "Esta es la opcin 2\n"; } else { print "No existe al opcin tecleada\n"; } 2. La instruccin while.

La instruccin while ejecuta iterativamente un bloque de instrucciones mientras una expresin sea vlida, evaluando la comprobacin en cada iteracin. Cuando la prueba es vlida, se ejecuta la instruccin o el bloque de instrucciones delimitado por las llaves. La sintaxis de esta instruccin es: while (expresin) { instruccin o bloque de instrucciones; } He aqu un sencillo ejemplo de manejo de esta estructura: print "Teclea \"x\" para salir:\n"; $ristra = ""; while ($ristra ne "x") { $ristra = <STDIN> ; chop($ristra); print "Has escrito $ristra\n"; } print "Salida.\n" 3. La instruccin for. La instruccin for permite ejecutar iterativamente un conjunto de instrucciones. La sintaxis de la instruccin for es: for (inicial_exp; test_exp; incremento_exp) { instruccin o bloque de intrucciones; } donde: ?? inicial_exp es la instruccin que inicializa el bucle. Consiste generalmente en la asignacin de un valor a una variable que permite controlar el nmero de iteraciones. ?? test_exp es la expresin evaluada en cada iteracin. Cuando esta expresin es verdadera, el bloque de instrucciones se ejecuta. ?? incremento_exp es la expresin que permite la actualizacin de la variable que controla el nmero de iteraciones. A continuacin veremos un ejemplo de esta estructura para iniciarnos en su manejo: print "10 Iteraciones\n"; for ($i=0; $i<10; $i++) { print "Interacin nmero $i\n"; } 4. La instruccin foreach. La instruccin foreach es similar a la funcin del mismo nombre de los Shells de Unix. Asocia iterativamente a una variable cada elemento de la lista. Esta sucesin de valores sirve para parametrizar la ejecucin del bloque de instruccin. La sintaxis de la instruccin foreach es: foreach $variable (@lista) { instruccin o bloque de instrucciones; } Las intrucciones for y foreach son equivalentes. Sin embargo, la utilizacin de una de estas instrucciones se justifica generalmente por el contexto. El ejemplo siguiente lo ilustra:

@lista = ("elem1", "elem2", "elem3", "elem4"); for ($i = 0; $i<= $#lista; $i++) { print $lista[$i], "\n"; } Este ejemplo no utiliza las caractersticas de los arrays en Perl. La utilizacin de la instruccin foreach permitir recorrer la lista de forma ms elegante. El ejemplo siguiente lo ilustra: @lista = ("elem1", "elem2", "elem3", "elem4"); foreach $elem_actual (@lista) { print $elem_actual, "\n"; } 5. La instruccin goto. La instruccin goto label permite cambiar el recorrido lineal de las lneas de cdigo prosiguiendo la ejecucin del programa en la lnea de etiqueta label. La etiqueta se define colocando al final del identificador dos puntos (:). En el siguiente ejemplo se podr ver mejor la contruccin del goto. if ($expr ne $expr_correcta) { goto error; } ... error: print "expresin incorrecta"; La utilizacin del goto en Perl no es recomendable. Por que le quita al cdigo legibilidad y aumenta la posibilidad de errores. 6. La instruccin last. La instruccin last interrumpe la ejecucin del bucle actual y se ejecuta la instruccin que sigue al bloque. El ejemplo siguiente permite interrumpir el bucle while cuando la variable i toma el valor 3. $i = 0; while($i < 6) { if($i == 3) { last; } $i++; } print "el valor de \$i es $i"; Cuando la instruccin tiene como argumento una etiqueta, la ejecucin prosigue en la lnea indicada por la etiqueta. 7. La instruccin next. La instruccin next es idntica a la instruccin continue en C. Interrumpe la ejecucin del bloque de instruccin actual y prosigue la ejecucin en la iteracin siguente. Esta instruccin no interrumpe completamente la ejecucin del bucle; la exp resin que controla el bucle se evala. Si el resultado de la expresin es vlido, el bucle se ejecuta de nuevo. Cuando una instruccin tiene como argumento una etiqueta, la instruccin prosigue en la lnea identificada por la etiqueta y no al principio del bloque. Seguidamente veremos un ejemplo de dicha instruccin:

print "Teclea \"x\" para salir:\n"; print "Si se pulsa la tecla \"s\" no se imprime:\n"; $ristra = ""; while ($ristra ne "x") { $ristra = ; chop($ristra); if ($ristra eq "s") { next; } print "Has escrito $ristra\n"; } print "Salida.\n" 8. La instruccin until. La instruccin until al igual que la instruccin while permite ejecutar un conjunto de instrucciones un nmero repetido de veces. Pero al contrario que la la instruccin while, la intruccin until ejecuta dicho bloque de instrucciones mientras no se verifique la comprobacin. La sintaxis es: until (expresin) { instruccin o bloque de instrucciones; } He aqu el ejemplo anterior pero utilizando la instruccin until. print "Teclea \"x\" para salir:\n"; print "Si se pulsa la tecla \"s\" no se imprime:\n"; $ristra = ""; until ($ristra eq "x") { $ristra = ; chop($ristra); if ($ristra eq "s") { next; } print "Has escrito $ristra\n"; } print "Salida.\n" 9. La instruccin unless. Esta instruccin es anloga al if, salvo que permite considerar la no verificacin de la prueba. Su sintaxis es la siguiente: unless (expresin) { instruccin o bloque de intrucciones 1; } Para ver mejor el funcionamiento del unless, modificaremos el ejemplo anterior para adaptarlo a dicha instruccin. print "Teclea \"x\" para salir:\n"; print "Si se pulsa la tecla \"s\" no se imprime:\n"; $ristra = ""; until ($ristra eq "x") { $ristra = ; chop($ristra); unless ($ristra eq "s") { next; } print "Has escrito $ristra\n";

} print "Salida.\n"

Expresiones regulares
Una expresin regular es un modelo o una forma de comparar con una cadena de caracteres. Esta comparacin es conocida con el nombre de pattern matching o reconocimiento de patrones, permite identificar las ocurrencias del modelo en los datos tratados. La utilizacin principal de las expresiones regulares en Perl consiste en la identificacin de cadenas de caracteres para la bsqueda modificacin y extraccin de palabras clave. De esta manera se pueden dividir las expresiones regulares en varios tipos que son: expresiones regulares de sustitucin, expresiones regulares de comparacin y expresiones regulares de traduccin. 1. Expresiones regulares de comparacin. Nos permiten evaluar si un patrn de bsqueda se encuentra en una cadena de caracteres, de modo que mediante este tipo de expresiones regulares obtendremos un valor lgico verdadero o falso segn se encuentre el patrn deseado. La sintaxis de este tipo de expresiones regulares es la siguiente: valor a comparar =~ patrn de bsqueda He aqu un ejemplo: # imprimimos todas las lneas que contengan "html". Ej.: "htmlexe" if ($linea =~ /html/) { print $linea; } Los patrones de bsqueda pueden integrar informacin relativa al contexto, tal como la bsqueda de lneas que empiecen por la cadena de caracteres, la extraccin de palabras que tengan prefijos o sufijos particulares... Estos contextos se tienen mediante una representacin particular del modelo. Esta representacin se explica en los siguientes apartados: 1.1. Patrones definidos por una clase de caracteres. A menudo resulta prctico extraer las palabras que contienen una cifra, una vocal, o caracteres de control particulares. El modelo as definido no se indica por un carcter particular sino por un clase de caracteres mediante el operador [ ]. He aqu algunas posibles construcciones: [aeiou] # Cualquier vocal [0-9] # Cualquier nmero del 0 al 9. [0123456789] # Igual [0-9] [0-9a-z] # Cualquier letra o cualquier numro [\~\@;:\^_] # Cualquiera de los caracteres(~,@,;,:^,_) Generalmente de puede definir una clase de caracteres valindose de la complementaria. sta se expesifica mediante la sintaxis [^ ]. Siendo el smbolo ^ el que representa la negacin de los caracteres o clase de caracteres consecutivos:

[^0-9]

# Carcter que no sea un dgito

La definicin del patrn por clase se contempla con un conjunto de caracteres de control. Estos facilitan la definicin de modelos complejos en rutinas de comparacin. Estos facilitan la definicin de patrones complejos en rutinas de comparacin. La siguiente tabla representa estas extenciones:

Por otro lado, decir que los smbolos \n, \r, \f y \t tienen su significado habitual, es decir, significan nueva lnea, retorno de carro, salto de pgina y tabulacin respectivamente. A continuacin veremos otra lista de caracteres genricos que aumentarn la flexibilidad en la contruccin de patrones de bsqueda. Estos caracteres se muestran en la siguiente tabla:

1.2. Referencia de patrones. Se utilizn para referenciar patrones en las expresiones regulares. Perl trabaja con dos tipos de operadores de comparacin: ?? $1,$2,...,$9. Sirven para referenciar uno de los patrones de bsqueda de la expresin regular. El nmero del 1 al 9 representa el patrn al que queremos referirnos dentro de la expresin regular. As un ejemplo del uso de este operador se puede observar en este cdigo en Perl que aade el articulo 'El' a un nombre comn: (en este ejemplo se utilizar una expresin regular de sustitucin que veremos en el siguiente apartado). $var = "coche"; $var =~ s/(coche)/El $1/; # $1 equivale a coche print $var; ?? \1,\2,...,\9. Este operador tiene la misma utilidad que el anterior se utiliza para referenciar patrones, pero esta vez la referencia se ha de producir dentro de la expresin regular. He aqu un ejemplo:

if ($var =~ (/^(\w)+.*\1$/) { print $var; } Esta expresin regular de comparacin tiene el siguiente significado: mediante la cadena ^(\w)+ nos referimos a todos los caracteres alfanumricos que forman parte del principio de la cadena contenida en $var, es decir, la cadena ha de empezar por uno o ms caracteres alfanumricos. Con la cadena .* referenciamos un conjunto arbitrario de caracteres de longitud desconocida, finalmente con la cadena \1 expresamos el primer patrn utilizado y con $ significamos que este patrn debe de estar al final de la cadena contendia en $var. En definitiva la expresin regular tomar el valor verdadero, cuando la cadena de caracteres contenida en $var tenga la misma cadena de caracteres alfanumricos al principio y al final. As por ejemplo, si $var tiene una cadena de caracteres como esta: 'hola juansdfa hola' el valor de la expresin regular ser cierto, ya que los espacios en blanco no se consideran caracteres alfanumricos. 1.3. Utilizacin de carcteres reservados. En la especificacin del modelo, cada carcter se interpreta para determinar las ocurrencias en los datos. Sin embargo, los caracteres siguientes: + ? . * ^ $ ( ) [ ] { } | & \ son reservados por el lenguaje y deben ir precedidos por el smbolo de barra inversa \. Esto permita ignorar su especificidad y considerar los como un carcter cualquiera. Por ejemplo: # busca ocurrencia de "ford" en $car $marca = "ford"; if ($car =~ /$marca/) { print $car; } # busca ocurrencia de "$marca" en $car if ($car =~ /\$marca/) { print $car; } 1.4. Combinacin de expresiones regulares. Se realiza con los operadores | y & que equivalen al or y al and lgico respectivamente. Por ejemplo, con el operador | podemos representar una lista de alternativas, es decir: if ($car =~ /ford | audi/) { print $car; } mientras que con el operador & exigimos que la variable contenga las dos expresiones regulares propuestas: if ($direccion =~ /calle & piso/) { print $direccion; } 2. Expresiones regulares de sustitucin.

Las expresiones regulares de sustitucin permiten cambiar los patrones de bsqueda por caracteres nuevos definidos por el usuario que componen el patrn de sustitucin, la sintaxis es la siguiente: valor a sustituir =~ s/patrn de bsqueda/patrn de sustitucin/opciones Las opciones las podemos ver en la siguiente tabla:

A continucin vamos a ver unos ejemplos para aclarar su manejo: $var = 'abc123yz'; $var =~ s/d+/$&*2/e; # $var = 'abc246yz' $var =~ s/d+/sprintf("%5d",$&)/e; # $var = 'abc 246yz' $var =~ s/\w/$& x 2/eg; # $var = 'aabbccc 224466yyzz' Nota: Como veremos en el captulo 10 con ms profundidad, $& es una variable predefinida por el lenguaje que contiene el valor de la ltima cadena de caracteres comparada exitosamente. 3. Expresiones regulares de traduccin. Este tipo de expresiones regulares tienen una manera de trabajar muy parecida a la de las sustituciones. En este caso se trata de comparar uno a uno los caracteres del patrn de bsqueda con los de la cadena de sustitucin, de modo que cada vez que se encuentra una ocurrencia que coincide con uno de los caracteres del patrn se intercambia por su correspondiente en la cadena del patrn de sustitucin. La sintaxis general de esta expresion regular es la siguiente: variable =~ tr/patrn de bsqueda/cadena a traducir/opciones Las opciones las podemos ver en la siguiente tabla:

Tambin decir que este operador devuelve el nmero de reemplazados o borrados. He aqu algunos ejemplos que nos servirn para tener una manejo: $var =~ tr/A-Z/a-z/; # transforma maysculas a minsculas $cnt = $var =~ tr/*/*/; # cuenta los arteriscos de $sky $cnt = $var =~ tr/0-9//;# cuenta y suprime las cifras de $sky $var =~ tr/a-zA-z//s; # elimina duplicados. bbookk -> bok $var =~ tr/a-zA-z/ /cs; # cambia los caracteres no alfabticos en espacios y elimina duplicados

4. Ejemplo. Seguro que ha estas alturas todava no se tiene claro la diferencia entre los distintos tipos de expresiones regulares, para aclarar el concepto introducimos los siguientes ejemplos: En primer lugar vemos una expresin regular de bsqueda que dar cierto si en la variable $copia se encuentra el patron copia. Si es as, como veremos se imprimir un mensaje. $copia = "copy, xcopy, diskcopy"; if ($copia =~ /copy/) { print "Encontrada la cadena copy"; } A continuacin viene un ejemplo de expresin regular de sustitucin: $copia ="copy, xcopy, diskcopy"; $copia =~ s/copy/copia/g; Esta operacin reemplaza todas las ocurrencias de copy por copia quedando: "copia, xcopia, diskcopia" En ltimo lugar realizaremos un ejemplo con una expresin regular de traduccin: $copia = "copy, xcopy, diskcopy"; $copia =~ tr/copy/12345/; Como se ve en este caso, se sustituye cade ocurrecia de 'c' por 1, de 'o' por 2, de 'p' por 3 y de 'y' por 4. El carcter de traduccin 5 es ignorado puesto que no tiene ninguna correspondencia con ninguno de los caracteres de patrn. Por tanto, el contenido de la variable $copia ser: "1234, x1234, disk1234" Otro caso podra ser el siguiente: $copia = "copy, xcopy, diskcopy"; $copia =~ tr/copy/123/; Este ejemplo es idntico a el anterior pero en este caso slo tenemos dos caracteres en la cadena de traduccin. As, cuando el nmero de caracteres en la cadena de traduccin es menor que el nmero de caracteres del patrn, las ocurrencia de los caracteres del patrn que no tienen correspondencia con ningn caracter de traduccin, son intercambiados por el ltimo de los caracteres de traduccin. Por tanto, el contenido de la variable $copia ser: "1233, x1233, disk1233"

Definicin de funciones
La definicin de funciones permite asociar un nombre a un conjunto de instrucciones Perl. La sintaxis para la definicin de funcin es: sub nombre_de_funcin { instrucciones; [return Variable o expresin;] } donde nombre_de_funcin representa el nombre de la funcin. A cada llamada a la funcin, el cdigo de instrucciones delimitadas por llaves se ejecuta. La definicin de una funcin es global y en consecuencia puede insertarse al principio o al final del archivo. La llamada a la funcin se puede realizar de dos formas: & nombre_de_funcin; do nombre_de_funcin(); Las dos formas producen el mismo resultado con la excepcin de que en el caso de do hay siempre que poner los parntesis. Una llamada a una funcin puede insertarse en las estructuras y operadores en Perl. El valor devuelto por la llamada a una funcin corresponde al valor precisado por el operador return. Cuando este est ausente, el resultado de la ltima instruccin corresponde al resultado de la ltima instruccin ejecutada en el cuerpo de la funcin. Por ejemplo: sub diferencia { if ($x < $y) { print "$x es inferior a $y\n"; $y-$x; } else { print "$x es superior o igual a $y\n"; $x-$y; } } $x = 2; $y = 3; $abs = &diferencia; # $abs = 1 En este ejemplo, la funcin visualiza un mensaje y devuelve el valor absoluto de la diferencia de $x y $y. Permutando las instrucciones de visualizacin y de clculo, la funcin devolver 1, valor correspondiente a una visualizacin correcta. Los argumentos de una funcin. Al llamar a una funcin cuando esta va seguida de una lista de variables, stas ltimas se consideran como sus argumentos. El lenguaje Perl duplica el contenido de estas variables en la variable predefinida @_ durante la ejecucin de la funcin. La variable @_ permite as acceder a los parmetros de la funcin. Estos se colocan en la matriz $_[0], $_[1], ..., $_[n-1] referenciando los diferentes argumentos de la funcin. Por ejemplo. sub diferencia { if ($_[0] < $_[1]) { $_[1]-$_[0]; } else { $_[0]-$_[1];

} } $abs = &diferencia(2,3); # $abs = 1 Las variables locales y globales. Las variables referenciadas en una funcin son de modo predeterminado variables globales, es decir, comunes a todo el script. Para evitar los conflictos entre las variables propias de la funcin y las otras variables, es necesario declarar explcitamente las variables locales (propias de la funcin) mediante el operador local. Este operador tiene como argumentos una lista de nombres de variables a las que asocia variables locales. Cuando hay conflicto entre nombre de variables locales y globales en la definicin de una funcin, slo se tiene en cuenta la variable local en el cuerpo de la funcin y el valor global queda sin cambios. Por ejemplo: sub producto { local($p) = 1; foreach $_(@_) { $p *= $_; } } $p = 3; print &producto(2,3,4); print "$p\n";

# visualiza 24 # visualiza 3

Es aconsejable asignar a las variables locales los argumentos pasados a la funcin. Esto permite una mejor legibilidad de las funciones. Esto se realiza combinando el operador local con la variable predefinida @_. Por ejemplo: sub Area_cuadrado { local($radio) = @_; return $radio*$radio; } Paso de parmetros por referencia. Hasta ahora hemos visto el pasa de parmetros por valor, es decir, no es posible cambiar los valores globales de los argumentos. Para hacer esto posible es necesario pasar a la funcin no los valores, sino los nombres de estas variables. Este modo se denomina paso por referencia y se implementa prefijando el nombre de la variable con un arterisco *. En el momento de la definicin de una funcion cuyos argumentos se pasan por referencia, la asignacin de los argumentos a las variables locales se hacen mediante el operador local(*nombre). El ejemplo siguiente ilustra este modo de paso de argumentos describiendo la rutina swap que hace la permuta de los valores de los argumentos. sub swap { local(*x, *y) = @_; # asignacin local de los argumentos local($t); # variable local $t = $x; $x = $y; $y = $t; return @_; # resultado de la funcin } $a = 4; $b = 1; &swap(*a, *b); # $a =1; $b = 4;

# el return sobra

Resulta esencial que la asignacin de los argumentos a las variables locales se haga mediante el operador local. Ya que la asignacin directa de la variable local mediante *nombre=valor modifica las ocurrencias de la variable nombre en el script. Por ejemplo: sub swap { (*a, *b) = @_; local($t); $t = $a; $a = $b; $b = $t; return @_; } $a = 4; $b = 1; $x = "pi"; $y = 1.414; &swap(*x, *y); print "a=$a, b=$b\n";

# asignacin de argumentos

# $x = 1.414; $y = "pi" # $a = 1.414; $b = "pi"

Entrada / Salida
Perl interacta con el usuario o con el sistema operativo por medio de entradas salidas que permiten el intercambio de informacin. Este intercambio de datos se gestiona por medio de operadores especficos que configuran una interfaz entre el script y su entorno. 1. El acceso a archivos en Perl. Perl accede a los archivos de tipo ASCII por medio de punteros a archivos. Estos se referencian mediante variables y constituyen el enlace entre el script y el archivo consultado. Se utilizarn maysculas para representar estas variables a fin de no equivocarse con otras variables. Los archivos se consultan mediante la rutina open que admite dos argumentos, un puntero de archivo y un nombre de archivo: open(PUNTERO, "modo de acceso + nombre de archivo"); El argumento de open que representa el nombre de archivo puede tener cualquiera de los prefijos que se muestran en la siguiente tabla, estos prefijos indican el modo de acceso al archivo (si no se pone ningn prefijo es que se toma el modo de acceso por defecto que es el de lectura):

En cuanto a los punteros a archivos decir que, cuando se ejecuta un programa en Perl su primera actividad es asignar un puntero o manejador de archivo para el canal de entrada, otro para el canal de salida y otro para el de informacin de errores. Estos punteros son respectivamente STDIN, STDOUT y STDERR, donde se puede observar que STD significa estndar. Los tres STD se usan con tanta frecuencia en Perl que a menudo se suponen que existen, y por consiguiente, Perl no necesita que se mencionen explcitamente, en lugar de ello, Perl los crea y les asigna canales automticamente. Por ejemplo: print "hola"; print STDOUT "hola"; Estas dos lneas realizan lo mismo ya que Perl supone que STDOUT es el monitor y por eso visualiza sin necesidad de indicar en ningn lugar STDOUT. En el ejemplo que se puede ver a continuacin, forzamos un error muy tpico en los progrmadores no cerrar comillas: print "hola; El resultado de la ejecucin de este programa ser un mensaje paracido a este: Can't find string terminator...line 3 Sabemos que con el simbolo > podemos redirigir una salida de pantalla a un archivo. Pero si tecleamos: hola.pl > error.txt El archivo error est vaco. Esto es porque la salida estndar de los errores STDERR es la pantalla. Para que se grave el error en el archivo hay que direccionar el canal de error, que en Unix es el 2, al archivo. Esto se hace como sigue: hola.pl 2>error.txt 2. El operador de entrada <>. Una vez iniciado el puntero mediante la rutina open, este mismo puntero permite acceder al contenido del archivo por medio del operador <>. El contenido del archivo se recorre lnea por lnea mediante la estructura <PUNTERO>. Al final de la utilizacin el archivo se cierra mediante el operador close. El ejemplo siguiente indica como acceder al contenido del archivo data.txt y guardar el resultado en el archivo out.txt:

open(IN, "data.txt"); open(OUT, ">out.txt"); while($linea = <IN>) { # manipula los caracteres leidos y puestos en la variable # $linea. Por ejemplo convertir los caracteres a minsculas $linea =~ tr/A-Z/a-z/; # escritura del resultado print OUT $linea; } close(IN); close(OUT); El ejemplo siguiente visualiza en la consola el nombre de cada usuario y su directorio predeterminado. Esta informacin se extrae del archivo "/etc/passwd" que contiene la descripcin de cada login. Para ello es necesario saber que cada lnea del archivo passwd est compuesta por: el nombre que usa el usuario para entrar (login), la contrasea encriptada (password), nmero que identifica al usuario (uid), nmero que identifica al grupo al que pertenece el usuario (gid), informacin sobre el usuario (User_Information), directorio inicial del usuario (login_directory) y el interprete de comandos usado por dicho usario (login_shell). Esta informacin relativa al usuario se estructura en dicho fichero en una lnea de la siguiente manera: login:password:uid:gid:User_Information:login_directory:login_shell Por tanto, este ejemplo se realizar de la siguiente manera: open(PASSWD, "/etc/passwd"); while ($p = <PASSWD>) { # lee una lnea del archivo chop($p); #quitamos el salto de lnea @field = split(/:/, $p); print " Usuario $field[0] y su directorio es $field[5]"; } close(PASSWD); A continuacin se da de alta a un usuario si clave de paso, esto se realiza escribiendo en el archivo "/etc/passwd": open(PASS, ">>/etc/passwd"); print PASS, "$login::$uid:$gid:$information:"; print PASS, "$login_dir:$login_shell\n"; close(PASS); Si STDIN se encuentra del operador <>, lee una lnea cada vez desde ese manejador de archivo. Por ejemplo: $uno = <STDIN>; $dos =<STDIN>; print $uno.$dos; Al ejecutar este script, teclear unas palabras seguidas de enter y repetir lo mismo una segunda vez. A medida que escribimos <STDIN> lee lo que tecleamos y al pulsar enter lo asigna a la variable $uno. Lo mismo ocurre le ocurre a $dos. Pero, si se ejecuta este otro script: while ($linea = <STDIN>) { print $linea; }

Este script permite hacer un bucle para leer y escribir tantas lneas como queramos. La condicin se escribe entre parntensis y las lneas que hacen el bucle entre llaves. Para finalizar la entradadesde el teclado pulsar Control+Z. Por otro lado, el acceso en lectura a un archivo es dependiente del contexto. En un contexto escalar, Perl lee un archivo lnea por lnea y lo asigna al escalar. En un contexto de array o lista, el acceso al contenido del archivo entraa una lectura completa del archivo. Cada elemento del archivo contiene entonces una lnea completa del archivo ledo. Por ejemplo: $file = "datos.txt"; open(DATA, $file) || die "no se puede abrir el archivo\n"; @lineas = <DATA> # lee todo el archivo. close(DATA); La funcin die manda una cadena de caracteres por el canal de error. Esta propiedad debe utilizarse con precaucin, porque la lectura completa de un archivo corre el riesgo de ser muy costosa en memoria. Por otra parte, el lenguaje Perl utiliza caches para las entradas/salidas y en consecuencia la lectura completa de un archivo no entraa necesariamente una ganancia en materia de rendiemiento. 3. Los canales de comunicacin (pipes). La rutina open de Perl puede utilizarse tambim para ejecutar mandatos del shell, modificar sus entradas y recuperar sus salidas. Cuando el nombre del archivo lleva como prefijo el carcter |, este nombre se trata como un mandato. Este mandato se ejecuta y comunica con el script Perl mediante la rutina print. Veamos un ejemplo: open(MAIL, "Mail root"); # prepara un mail al superusuario # contenido del mail print MAIL "La cuenta del usuario a2344 ha expedido"; # envo del mail close(MAIL); Por otro lado, cuando el nombre del archivo va seguido del carcter |, el mandato se ejecuta y se puede acceder a su resultado por medio del operador <>. Por ejemplo: # examina las personas conectadas a la mquina open(WHO, "who|"); while($who = <WHO>) { chop $who; # suprime el retorno de carro ($user, $tty, $junk) = split(/\s+/, $who, 3); print "El usuario $user est en la terminal $tty\n"; } close(WHO); 4. Los operadores de comprobacin de archivos. Estos operadores tratan de resolvernos diferentes problemas como la verificacin de la existencia de un archivo antes de modificarlo o la supresin de archivos existentes en la creacin de archivos con el mismo nombre. Estas verificaciones se llevan a cabo mediante operadores que proporcionan informacin relativa a los archivos. Estos opeadores que veremos en la tabla que se muestra a continuacin son unarios, su argumento es un puntero de archivo.

Por ejemplo: $data = "data.txt"; if (e- $data) { # OK, el archivo existe open ... } else { print "el archivo $data no existe.\n"; } 5. Las funciones print, printf y sprintf. Las funciones print y printf permiten la escritura o la visualizacin de un resultado. El operador print enva la cadena de caracteres al puntero de archivo pasado como argumento. Cuando ste est ausente, el utilizado es el puntero STDOUT que representa la salida estndar (la consola). La sintaxis de este operador es: print PUNTERO $str1, $str1, ..., $strN; Por otro lado la funcin printf permite especificar el formato de escritura. El texto as formateado se enva al puntero de archivo pasado como argumento. Este formato es idntico al del lenguaje C. Por lo tanto el texto formateado consta de una ristra de caracteres. Los caracteres de ristra se escriben tal cual a excepcin del %. El % indica que hay que mostrar un parmetro de la lista, el siguiente al ltimo mostrado, con un formato en concreto el cual lo indica el caracter que sigue al %. Los caracteres ms comunes y el tipo de datos que representa se muestra en la siguiente tabla:

Si se desea imprimir el % como un carcter dentro de una cadena de control, debe utilizarse %%. Hay que tener en cuenta que los literales de ristras permiten escribir caracteres especiales con lo que se denomina un secuencia de escape. La secuencia de escape comienza siempre con "\" y a continuacin se escribe otro carcter que representa el cdigo especial o el nmero en octal o hexadecimal de su cdigo ASCII. Las secuencias de escape representan un nico carcter en la ristra donde aparecen.

Un ejemplo sencillo: printf PUNTERO "%s %f", $string, $float; printf "Enteros: base10=%s, base8=%o, base16=%x\n", $y, $z, $w; # El identificador es STDOUT (visualizacin por pantalla). La funcin sprintf devuelve una cadena de caracteres formateada por la conveciones normalmente utilizadas por printf, para ello se recomienda ver las dos tablas anteriores. Para ver mejor el funcionamiento de esta rutina introducimos el siguiente ejemplo:

$lenguaje = "Perl"; $longitud = 10; $conformato = sprintf("%s", $lenguaje); print $conformato,"\n"; # Imprime:Perl $conformato = sprintf(">>%s<<", $lenguaje); print $conformato,"\n"; # Imprine:>>Perl<< $conformato = sprintf(">>%s <<", $lenguaje); print $conformato,"\n"; # Imprime:>>Perl << $conformato = sprintf(">>%10s<<", $lenguaje); print $conformato,"\n"; # Imprime:>> Perl<< $conformato = sprintf(">>%-10s<<", $lenguaje); print $conformato,"\n"; # Imprime:>>Perl << $conformato = sprintf(">>%-${longitud}s<<", $lenguaje); print $conformato,"\n"; # Imprime:>>Perl << 6. Las funciones para manejo de ficheros. Para realizar un mejor tratamiento de los datos que se encuentran en ficheros, Perl posee una serie de funciones predefinidas que nos ayudan a realizar esta tarea con gran facilidad y simp leza. A continuacin mencionaremos a las funciones ms usadas por todos los programadores de Perl. ?? read(manejador, variable, longitud, [desplazamiento]). Esta funcin lee desde un fichero, especificado en el parmetro manejador, un nmero de bytes, especificado por el parmetro longitud, y lo introduce en una variable de tipo escalar representada por el parmetro variable. El parmetro desplazamiento, si se especifica, indica desde que posicin del fichero se empieza a leer. Por defecto, es la posicin donde se encuentra el puntero. He aqu algunos ejemplos: open(DAT,"<datos.txt"); read(DAT, $var, 30); # $var tiene los primeros 30 caracteres de # datos.txt ?? seek(manejador, posicin, referencia). La funcin seek pone el puntero del fichero especificado por el parmetro manejador en el lugar indicado por el parmetro posicin. El parmetro posicin puede tener un valor positivo que nos indica un desplazamiento hacia el final del fichero o un valor negativo que nos indica un deplazamiento hacia el inicio del fichero. Este desplazamiento indicado en el parmetro posicin se puede hacer desde el principio del fichero, desde la posicin del puntero actual del fichero o desde el final del fichero. Esto lo determina el parmetro referencia con los valores 0,1 y 2 respectivamente. Ejemplo: open(DAT,"<datos.txt"); read(DAT, $var, 30); seek(DAT,-31,1); read(DAT, $var, 30); # Volvemos a leer lo mismo. ?? tell(manejador). Esta funcin retorna la posicin del puntero en el fichero especificado en el parmetro manejador. Ejemplo:

open(DAT,"<datos.txt"); read(DAT, $var, 30); $ptr = tell(DAT); # $ptr = 31; ?? eof(manejador). Esta funcin retorna 1 (verdadero) si el fichero especificado por el parmetro manejador tiene el puntero en el final del mismo. Tambim devolver uno si el manejador no est asociado a ningn fichero. En el ejemplo que viene a continuacin se leer un fichero de nombre en el que cada uno de ellos est en una lnea del fichero y ocupa 50 caracteres contando con el de salto de lnea. open(NOM,"<nombres.txt); while (!(eof(NOM))) { read(NOM, $nombre, 50); print $nombre; }

Variables predefinidas
Las siguientes variables tienen un especial significado para el lenguaje Perl. Estas variables se pueden clasificar en tres tipos: 1. De fichero. Estas variables contienen algunos valores perteneciente la manejador de ficheros seleccionado actualmente. Cada manjador de fichero necesita su propio conjunto de valores. Cuando seleccionamos otro manejador de fichero, el manejador de fichero anterior mantiene sus valores pero las variables reflejarn ahora los valores del nuevo. Los variables predefinidas de fichero son las siguientes: ?? ?? ?? ?? ?? ?? $%: Nmero de pgina del canal de salida actual. $=: Tamao de pgina del canal de salida actual. $- : Nmero de lneas restantes en la pgina del canal de salida actual. $|: Si no es cero, fuerza a vaciar el buffer despus de cada operacin de escritura. $~: Contiene el nombre del formato o report definido para la salida actual. $^: Es el nombre del formato o report de la cabecera definido para la salida actual.

2. Locales. Estas variables son locales al bloque de cdigo actual. Las variables locales predefinidas son las siguientes: ?? $1...$9: Contiene la subcadena desde el correspondiente al conjunto de parntesis en la ltima cadena comparada con xito. ?? $&: Representa el valor de la ltima cadena de caracteres comparada con xito. ?? $`y $: Estos dos trminos se utilizan conjuntamente para separar cadenas de caracteres comparadas con xito. ` es la anterior y es la siguiente. Ejemplo:

$linea = 'abcdefghi'; $linea =~ /def/; print "$`:$&:$'\n";

# imprime abc:def:ghi

?? $+: El ltimo xito de la ltima bsqueda del ltimo patrn. Es til cuando no se sabe que patrn de un conjunto fue el encontrado. 3. Globales. Estas variables tiene el mismo significado en todo el script, as como en los paquetes que utiliza. Las variables globales predefinidas son las siguientes: ?? $_: Contiene el contenido del ltimo registro ledo de un fichero. Es el argumento predeterminado que poseen varias funciones y construcciones en Perl. Por ejemplo: if (/html/) { /html/) { print $_; } while (<STDIN>){ <STDIN>){ print "escrito: ", $_ ", $linea; } $_ = "nom1&nom2"; "nom1&nom2"; @lista = split(/&/); split(/&/, $linea); ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? if ($linea =~ print $linea; } while ($linea = print "escrito: } $linea = @lista =

$.: Contiene el nmero de la ltima lnea leda de un fichero. $/: Separador de campo para la entrada. $,: Separador de campo para la salida, aplicable a print. $\: Separador de registro para la salida, aplicable a print. $"": Como $, se aplica a arrays en bsquedas de cadenas entre dobles comillas (cadenas que se interpreten de la misma forma). $#: El formato de salida para mostrar nmeros. $$ : Es el nmero de proceso perl del scripts que se esta ejecutando actualmente. $?: El valor de estado devuelto por la ltima tubera (pipe) que se cerr, por el comando ejecutado con el backquote (`\`) o por una operacin del sistema. $*: Puesto a 1 realiza bsquedas en varias lneas con una misma cadena, a 0 para indicar al compilador que las cadenas son de una nica lnea para optimizar bsquedas. $[: Contiene el valor del primer ndice de una array de escalares, por defecto es 0. $]: Contiene la cadena mostrada cuando se invoca "perl -v", es decir la versin del compilador, etc. Puede ser til para comprobar al comienzo del script, que la versin del intrprete que ejecuta el script es la correcta. $;: Es el separador para emular arrays multi-dimensionales. $!: Contiene el valor actual de ERRNO, es decir, el ltimo error acontecido. $0: Contiene el nombre del fichero que hemos dado a nuestro perl script. $<: Uid real del proceso actual. $>: Uid efectivo del proceso actual. $@: Contiene el mensaje de error de sintaxis de perl del ltimo comando evaluado. Si es nulo quiere decir que el ltimo comando se ejecut correctamente y estaba bien escrito. $(: Gid real del proceso actual. $): Gid efectivo del proceso actual.

?? @ARGV: Contiene los parmetros pasados a nuestro script Perl. Por ejemplo: # Lee argumentos de la lnea de comando y los lista. $NumArg = $#ARGV; # Almacena el nmero de argumentos $Cuenta = 0; while ($Cuenta < $NumArg) { print "Argumento0 ",$Cuenta,"->",$ARGV[$Cuenta], "\n"; $Cuenta++; } ?? %ENV: Array asociativo que contiene las variables de entorno bajo el que se ejecuta nuestro script Perl. ?? $:: El conjunto actual de caracteres tras los que una cadena se rompe para llenar los campos siguientes (que empiecen con ^) en un formato. ?? $^D: Los valores actuales de los flags de depuracin. ?? $^F: El mximo descriptor de fichero del sistema, normalmente 2. Los descriptores de fichero del sistema son pasados a los procesos hijos, mientras que los superiores no. Durante una apertura, los descriptores de fichero del sistema se guardan, incluso si falla la operacin. ?? $^I: Contiene el valor actual de la extensin del editor. Con undef se desactiva. ?? $^L: Qu formato utilizar para realizar un salto de lnea. Por defecto: \f. ?? $^P: Flags internos que el depurador borra. Se puede desactivar el depurador borrndolos. ?? $^T: El tiempo, en segundos, transcurrido desde que el script comenz a ejecutarse. ?? $^X: El nombre con el que Perl se ejecut, argv[0]. ?? $ARGV: Contiene el nombre del fichero actual cuando se lee de <ARGV> . ?? @INC: El array INC contiene la lista de lugares en donde buscar scripts en Perl para ser evaluados por el comando "do EXPR" o "require". Contiene inicialmente los argumentos de cualquier lnea de comando -I , seguido de la librera Perl por defecto, probablemente "/usr/local/lib/perl", y un punto ".",para representar el directorio actual. ?? %INC: El array asociativo INC contiene entradas para cada nombre de fichero que ha sido incluido va "do" o "require". La clave es el nombre del fichero especificado y el valor es la localizacin del fichero encontrado. El comando "require" usa este array para determinar cuando un fichero ha sido incluido. ?? $ENV{expr}: Es un array asociativo que contiene tu entorno actual. El entorno de los procesos hijo se puede cambiar colocando un valor en este array. ?? $SIG{expr}: Es otro array asociativo usado para inicializar manejadores de seales para distintas seales. Este array slo contiene valores para las seales inicializadas por el script.

Das könnte Ihnen auch gefallen