0% encontró este documento útil (0 votos)
256 vistas42 páginas

Tutorial Perl

Este documento presenta una guía introductoria al lenguaje de programación Perl. Explica que Perl fue creado por Larry Wall con el objetivo de simplificar tareas comunes en sistemas Unix y ahora es un lenguaje de propósito general, muy usado para programación web. También describe los tipos de datos soportados por Perl como números, cadenas y booleanos, y cómo se representan y manipulan variables, arreglos y otras estructuras de datos en este lenguaje.

Cargado por

Zeus Hernandez
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
256 vistas42 páginas

Tutorial Perl

Este documento presenta una guía introductoria al lenguaje de programación Perl. Explica que Perl fue creado por Larry Wall con el objetivo de simplificar tareas comunes en sistemas Unix y ahora es un lenguaje de propósito general, muy usado para programación web. También describe los tipos de datos soportados por Perl como números, cadenas y booleanos, y cómo se representan y manipulan variables, arreglos y otras estructuras de datos en este lenguaje.

Cargado por

Zeus Hernandez
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 42

Universidad Nacional de Lujn - Gua del lenguaje Perl

Gua Introductoria al Lenguaje Perl


versin 2.1

Fernando Bordignon, Gabriel Tolosa y Fernando Lorge


{bordi, tolosoft, florge}@mail.unlu.edu.ar

Laboratorio de Redes de Computadoras Divisin Estadstica y Sistemas Universidad Nacional de Lujn La presente gua es una versin quick and dirty -tal como dicen los anglosajones- con el objetivo de lograr un primer acercamiento al lenguaje. Se sugiere complementar el estudio con bibliografa adicional, como la recomendada. Charles Babbage dijo "se cometen muchos menos errores usando datos incorrectos, que no empleando dato alguno". Es por esto que se pide perdn por los posibles errores que se hayan deslizado, y se solicita al lector que contribuya a mejorar este material de estudio, a partir de las correcciones y crticas que pueda aportar.

Fuentes de bibliografa adicional sobre el lenguaje Perl: Pgina oficial del lenguaje Perl. http://www.perl.com Curso de Perl (en ingls) http://fpg.uwaterloo.ca/perl/start.html Perl Mongers. http://www.perl.org/ Editorial OReilly, pgina del lenguaje Perl. http://perl.oreilly.com/ PerlDoc. http://www.perldoc.com/ The Perl Journal. http://www.tpj.com/ Perl Chile. http://www.perl.cl/ En su <X>unix escriba: man perl

Lugares de descarga del lenguaje: Pgina oficial del lenguaje Perl. http://www.perl.com CPAN - Mdulos Perl. http://www.cpan.org/ Activestate. Perl para Windows. http://www.activestate.com/

Filosofa de Perl: "Hay ms de una forma de hacerlo" segn Larry Wall, su autor.

Universidad Nacional de Lujn - Gua del lenguaje Perl

Introduccin al Lenguaje
"Si no noto la resistencia del papel frente a la pluma, me siento incapacitado" Jean Daniel

Perl significa Lenguaje prctico de extraccin y reporte (Practical Extraction and Report Language) . Su creador fue Larry Wall, y su objetivo era simplificar las tareas habituales a realizar en el sistema operativo Unix. Hoy es un lenguaje de propsito general, de alta portabilidad y es la herramienta principal que utilizan los webmasters para implementar programacin a travs de la interfase CGI. Perl es un lenguaje interpretado, aunque transparentemente compile los programas antes de ejecutarlos. Es por ello que los ortodoxos de la comunidad hablan de guiones (scripts) y no de programas. Existe una numerosa cantidad de programadores Perl distribuidos a lo largo del mundo, ellos da a da producen nuevos mdulos de librera que extienden asombrosamente las capacidades del lenguaje. En Perl, practicamente, es posible programar casi cualquier problema; maneja: comunicaciones entre computadoras, bajo protocolos TCP/IP; implementa hilos de ejecucin (threads); implementa -opcionalmente- el estilo de programacin orientado a objetos, posee APIs con todos los protocolos populares de aplicacin en Internet. Aunque su punto debil es la perfomance en la ejecucin de guiones -no alcanza las velocidades ofrecidas por lenguajes como el C-, Perl es un excelente lenguaje destinado al aprendizaje y el desarrollo de prototipos de modelos de software. PERL es gratuito, hay completa libertad de copiar el cdigo fuente, compilarlo, imprimirlo, compartirlo, etc, pero todo esto es bajo la licencia GNU, que en trminos generales ordena que cualquier programa que se desarrolle se debe liberar, o sea si Ud. puede utilizar el cdigo hecho por otros; otros pueden usar el cdigo hecho por Ud. Como se mencion anteriormente, la portabilidad es una caractersticas de Perl. Los guiones se pueden ejecutar sobre distintos sistemas operativos como ser: Linux, System de Macintosh, Microsoft Windows, Solaris de Sun, BSD, etc. En definitiva, un programa puede correr en cualquier sistema operativo sin tener que modificar el cdigo fuente; solamente es necesario poseer el interprete de Perl para cada sistema y libreras adicionales que use. Con Perl se pueden: construir pequeos programas destinados a ser usados como filtros para obtener informacin en base a la lectura de archivos, realizar bsquedas, etc. Es uno de los lenguajes ms utilizados en la programacin de la interfase CGI, que sirve para el intercambio de informacin entre aplicaciones externas y el espacio web. Por ejemplo programas de bsqueda, y procesamiento de formularios, entre otros. El siguiente es el clsico ejemplo de primer programa Perl #!/usr/local/bin/perl print "Hola Mundo!!!\n"; En la primer linea se le indica al sistema operativo el camino del interprete Perl, para que lo pueda cargar y ejecutar, y le pase como parmetro el guin que se halla ms abajo. Por norma, todo guin lleva la extensin pl y se lo escribe utilizando un editor ASCII normal. Inicialmente, para ejecutar un programa siga la siguiente sintaxis: perl <nombre_del_programa.pl>

Universidad Nacional de Lujn - Gua del lenguaje Perl

Para un mejor anlisis de un programa, puede redireccionarse su salida a un archivo utilizando en la orden de ejecucin el smbolo de redireccin ">" y a continuacin un nombre de archivo.

Universidad Nacional de Lujn - Gua del lenguaje Perl

Tipos de Datos, Variables y Arreglos


"La comunicacin se compone de quien habla, quien escucha y lo que se dice". Aristteles

Perl permite representar los siguientes tipos de datos bsicos: reales, enteros, cadenas de caracteres y booleanos.

Los tipos numricos (reales y enteros). Los valores numricos se presentan en forma de valores reales codificados en doble precisin. Este formato interno se utiliza para todas las operaciones aritmticas. $z = 0.127; $x = 3.22e-14; $c = 1567; $d = -122; # real # real # entero # entero

Los valores enteros no pueden empezar por cero porque esto permite especificar un entero mediante su codificacin octal o hexadecimal. El cdigo octal comienza con cero 0; el cdigo hexadecimal comienza con 0x. $x = 0377; $y = 0xff; # Representacin octal, equivale a 255 decimal # Representacin hexadecimal, equivale a 255

Las cadenas de caracteres. Las cadenas de caracteres se representan por medio de un sucesin de caracteres delimitada por comillas apstrofes. Cuando una cadena se delimitada por comillas, toda variable referenciada en el interior de la cadena se evala y se reemplaza por su valor. Por ejemplo: $cadena = "Brothers"; $almace = "Blues $cadena"; Por el contrario, las cadenas de caracteres delimitadas por apstrofes se dejan intactas. Existe una sintaxis especial que permite delimitar una cadena de caracteres cuando contiene varias lneas y/o comillas o apstrofes. 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:
$cadena = <<SALUDO; hola, buenos das, adios, SALUDO

Universidad Nacional de Lujn - Gua del lenguaje Perl

El tipo booleano. El tipo booleano existe 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 cadena vaca (""), sta tambin equivale al valor falso. Representaciones de datos. Perl maneja datos escalares, siendo todos aquellos que contienen un valor; no importa si es real, entero, caracter o cadena; el lenguaje los reconoce automticamente.El lenguaje posee tres tipos de representaciones de datos Variables escalares. Arreglos indexados escalares (listas). Arreglos asociativos escalares (hash). Las representaciones de datos son determinadas por la anteposicin de un caracter especial. $ Escalar. @ Arreglo Indexado. % Arreglo Asociativo. & Funcin Procedimiento Todas las representaciones tienen su propio nombre, as como las etiquetas, funciones, archivos y manejadores de directorios. Variables escalares. Se utiliza el caracter $ para indicar un valor escalar. La asociacin bind de una variable con valor se hace con el caracter =. $foo = 55.23; $foo = 'esta es una cadena'; $foo = "era $foo antes"; $salida= `cd`; ($a, $b) = ($b, $a) Ejemplo: Sumar dos nmeros y luego aplicar el operador de post-incremento
#!/usr/local/bin/perl $a = 10; $b = 5; $suma = $a + $b; print "Resultado:.$suma.\n"; $suma++; print "Despues de incrementar: $suma \n";

# variable interpolada. # Se invoca al sistema operativo y el resultado de la salida # se almacena en el escalar de la izquierda. # intercambio (swap)

Ejemplo: Verificar el mtodo de intercambio de variables


#!/usr/local/bin/perl

Universidad Nacional de Lujn - Gua del lenguaje Perl

$a = Mundo; $b = Hola; ($a, $b) = ($b, $a); print "La famosa frase es $a $b!!! \n";

Las secuencias de escape se utilizan a los efectos de representar caracteres especiales modifcar un valor. Algunas son \n \t \0oo \xhh \\ \" \L \U \E Nueva lnea Tabulador oo valor octal de ASCII hh valor hexadecimal de ASCII Diagonal invertida Comillas dobles Minsculas todas las letras hasta \E Maysculas todas hasta \E Terminar \L o \U

Print dato \t separado\n;

Print la barra \\ sirve ...; Print las comillas \ sirven ...; Print \LEN MINUSCULAS\E; Print \Uen mayusculas\E;

Ejemplo: Ingresar dos cadenas y comparar si son iguales, idependientemente que sus caracteres esten en maysculas o minsculas.
#!/usr/local/bin/perl print "Ingrese 1er cadena:"; $cadenaa =<STDIN>; #se pide ingreso por teclado chop($cadenaa); #chomp elimina de cadenaa el enter print "Ingrese 2da cadena:"; $cadenab=<STDIN>; chop($cadenab); $tmpa = "\U$cadenaa\E"; $tmpb = "\U$cadenab\E"; if ($tmpa eq $tmpb) {print "$tmpa y $tmpb son iguales \n";} else {print "$tmpa y $tmpb NO son iguales \n";}

Arreglos Arreglos Indexados En PERL los arreglos son listas de datos sin importar su tipo, es decir que puede estar compuestos por enteros flotantes, cadenas, o incluso otros arreglos, cada elemento es considerado como una variable independiente. El caracter $ se utiliza para referirse a un elemento en particular y el caracter @ para todos. El primer elemento de un arreglo es el indicado con 0 (cero). $arreglo[$i+2] = 3; @arreglo = ( 1, 3, 5 ); @arreglo = ( ); @foo = @bar; @foo = @bar[$i..$i+5]; $numero = $#arreglo; # Instancia el elemento $i+2 con el valor 3. # Inicializa el arreglo llamado arreglo # Inicializa un arreglo vaco. # copia el arreglo. # copia una parte del arreglo. # el numero se almacena el valor de ndice ms alto # definido. Es decir la cantidad de elementos del arreglo-1

Universidad Nacional de Lujn - Gua del lenguaje Perl

Ejemplo:
#!/usr/local/bin/perl @a = (95, 7, 'fff' ); # se instancia el arreglo a con 3 elementos print $a[2]; # imprime el tercer elemento (fff) print @a; # imprime todo el arreglo 957fff

Ejemplo:
#!/usr/local/bin/perl @arreglo1 = (10, 20, 30); @arreglo2 = (100, 200); @arreglo3 = (@arreglo1, @arreglo2, 8, "es una cadena"); $longitud_arreglo3 = @arreglo3; # imprimir el arreglo for ($n=0; $n<$longitud_arreglo3; $n++) {print $arreglo3[$n]."\n"};

Nota: Se a inicializado arreglo 3 con dos arreglos y dos variables escalares, por lo cual arreglo 3 paso a tener 7 elementos. Ejemplo: Se pueden definir valores de una lista por medio de la tcnica de rangos:
#!/usr/local/bin/perl @a = (2..7); # $a se instancia con (2,3,4,5,6,7); @b = ('a'..'e'); # $b instancia con ('a','b','c','d','e') for ($n=0; $n<@a; $n++) {print $a[$n]. ;}; print \n; $n=0; while($n<@b) {print $b[$n]. ;$n++;}; print \n;

Ejemplo: La funcin join convierte un arreglo en un escalar y la funcin split hace lo inverso, convierte una variable escalar en una lista.
#!/usr/local/bin/perl @a = ('a'..'e'); $a = join(":", @a); print $a.\n; # se obtiene "a:b:c:d:e" @lista = split(:, $a); for ($n=0; $n<@lista; $n++) {print $lista[$n]. }; print \n;

Ejemplo: La funcin splice permite extraer un subarreglo y a la vez modificar el arreglo original
@a = ( 'a'..'e'); @b = splice( @a, 1, 2); # A partir del elemento 1 tome 2 for ($n=0; $n<@a; $n++) {print $a[$n]. }; print \n; # @b queda con 2 elementos de @a: $a[1] y $a[2]; # ( 'b', 'c') for ($n=0; $n<@b; $n++) {print $b[$n]. }; print \n; # @a queda sin esos 2 elementos: # ( 'a', 'd', 'e' );

Universidad Nacional de Lujn - Gua del lenguaje Perl

# Se agrega un cuarto argumento (@b)y en @a se reemplaza el segundo elemento solamente (2, 1)- con el arreglo @b. @a = ('a'..'e'); @b = (1..3); splice( @a, 2, 1, @b); for ($n=0; $n<@a; $n++) {print $a[$n]. }; print \n; # Se imprime 'a', 'b', 1, 2, 3, 'd', 'e' dado que # el elemento de valor 'c' se reemplazo con (1, 2, 3) # Es posible insertar sin eliminar elemento alguno @a = ( 'a'..'e'); @b = ( 1..3); splice( @a, 2, 0, @b); for ($n=0; $n<@a; $n++) {print $a[$n]. }; print \n; # Se imprime 'a', 'b', 1, 2, 3, c', 'd', 'e';

Arreglos n-dimensionales En la siguiente instruccin se define un arreglo de 4 filas por 3 columnas -recordar que en Perl un arreglo comienza con el ndice numrico 0@arreglo = ( [1, 2, 3], [4, -5, 6], [7, 8, 9], [10, 11, 12]); print $arreglo[3][1]."\n"; # Imprime 11

Un arreglo no es ms que una lista donde un elemento n puede ser a su vez otro arreglo, por lo tanto no es necesario que todas las filas tengan la misma longitud.
@m1 @m2 @m3 @m = = = = ( ( ( ( 1 , "maria" ); "pablo", "guillermo", "silvina" ); "rosa", "agustin" , 3 ); [@m1], [@m2], [@m3] ); # Imprime agustin

print $m[2][1]."\n";

Para determinar la cantidad de filas y columnas se utiliza:


print $#arreglo."\n"; print $#{$arreglo[1]}."\n"; # Brinda la cantidad de filas-1 del arreglo # Brinda la cantidad de elementos-1 de la fila 1

Ejemplo: Programa que imprime un arreglo bidimensional.


@arreglo = ( [1, 2, 3], [4, -5, 6], [7, 8, 9, 99, 999], [10, 11, 12]); for($i=0; $i<=$#arreglo; $i++) { for($j=0; $j<=$#{$arreglo[$i]}; $j++) {print $arreglo[$i][$j]."\t"}; print "\n"; }

Un arreglo de tres dimensiones puede definirse de la siguiente manera


@arreglo = ( [[1,2,3], [4,5,6], [7,8,9] [["a","b","c"],["d","e","f"], ["g","h","i"] ], ],

Universidad Nacional de Lujn - Gua del lenguaje Perl

);

[[-1,-2,-3],

[-4,-5,-6],

[-7,-8,-9]

print $arreglo[0][1][2]."\n"; # Imrpime 6 print $arreglo[2][2][1]."\n"; # Imprime -8

Pilas y colas con arreglos La funcin shift extrae el 1er elemento de un arreglo y ademas lo elimina. La funcin pop extrae el ltimo elemento de un arreglo y lo elimina. Por otro lado existen las funciones unshift y push que realizan lo inverso respectivamente. Unshift agrega un elemento o una lista de elementos al comienzo de una lista y push hace lo mismo, pero al final de la lista. Ejemplo:
#!/usr/local/bin/perl @a = ('a'..'e'); $b = shift(@a); # $b se instancia con 'a' for ($n=0; $n<@a; $n++) {print $a[$n]. }; print \n; # Se imprimen los valores b, c, d y e @a = ('a'..'e'); $b = pop(@a); # $b se instancia con 'e' for ($n=0; $n<@a; $n++) {print $b[$a]. }; print \n; # Se imprimen los valores a, b, c y d unshift(@a, 1); # agrega 1 al principio del arreglo push(@a, 999); # agrega 999 al final del arreglo for ($n=0; $n<@a; $n++) {print $b[$a]. }; print \n;

Con las funciones descriptas es posible construir una estructura de datos denominada pila (stack); se caracteriza por que su acceso es LIFO, (last input first output) es decir que el ltimo elemento aadido es el primero en ser leido, para lo cual se utiliza la funcin shift para extraer y la funcin unshift para insertar. Toda estructura de datos llamada cola opera en modo FIFO (First Input First Output), donde el primer elemento en ingresar es el primer elemento en salir. Por ejemplo, se podra implementar una cola leyendo con shift y agregando con push. Alternativamente se podra leer con la funcin pop, y agregar con unshift. A continuacin se muestran invertidos una lista de nmeros ingresados por teclado Ejemplo:
#!/usr/local/bin/perl @pila = (); print "Ingrese una lista de nmeros $numero = <STDIN>; while ($numero != -1) { unshift(@pila,$numero); $numero = <STDIN>; } # se crea la pila <terminar con -1> "; # se agrega un elemento a la pila

$l = @pila; for($i=1; $i<= $l; $i++) { print shift(@pila) };

# se extrae elemento de la pila

Universidad Nacional de Lujn - Gua del lenguaje Perl

Arreglos Asociativos Se caracterizan por que se puede definir cualquier tipo de dato escalar como ndice. El caracter $ se utiliza para refererirse a un elemento escalar y el caracter % para todos. Para asignar valores a un arreglo asociativo, se utilizan las llaves ({ }) alrededor de la clave de ndice. Para referirse a un arreglo asociativo en su totalidad, se usa su nombre precedido del smbolo "%"; si por el contrario se desea acceder solamente a un elemento se usa el nombre del arreglo anteponiendo el smbolo "$". Si lo que se quiere es manipular las llaves o los valores se usa el smbolo "@" antes del nombre. Sobre los arreglos asociativos se se realizan tres operaciones principales: 1. obtener el valor asociado a una clave 2. cambiar el valor asociado a una clave. 3. Verificar si una clave existe. En el siguiente ejemplo se define un arreglo asociativo llamado stock con sus pares de clave-valor,
%stock = (limones => 6, peras => 3, uvas => 2);

A la estructura anterior se le pueden agregar modificar pares clave-valor de la siguiente forma


$stock{peras} = 9; $stock{bananas} = 4;

Una forma de crear un arreglo asociativo es a partir de pares de datos clave-valor leidos de un archivo Ejemplo:
open FILE, "frutas.txt" or die(Error $!); while (<FILE>){ $linea = chomp($_); @tmp = split(/\t/); # se elimina el fin de linea # se separa el registo en campos # (el tabulador es el delimitador) # se asigna par clave-valor

$stock{$tmp[0]} = $tmp[1]; } close FILE or die(Error $!);

Un par clave-valor se borra con


delete $stock{uvas};

Un arreglo completo se borra


undef %stock;

Para eliminar todas los pares claves-valor, pero no la estructura, se utiliza


%stock = ();

10

Universidad Nacional de Lujn - Gua del lenguaje Perl

Para navegar una estructura se pueden utilizar varias formas. La instruccion foreach permite recorrer la estructura de forma completa. La variable $clave se instancia con el valor de la clave.
foreach $clave (keys %stock) { print "$clave = $stock{$clave}\n"; }

Tambin con el elemento map, es posible listar las claves.


print map "$_ = $stock{$_}\n", keys %stock;

Se puede utilizar while y each para leer una arreglo asociativo


while (($key,$valor) = each %stock){ print "$key = $valor\n"; }

La funcin keys crea un arreglo indexado con las claves de un arreglo asociativo
%a = ( x => 5, y => 3, z => 'abc' ); @b = keys %a # @b se instancia con ( 'x', 'y', 'z');

La funcin values devuelve un arreglo indexado con los valores de arreglo asociativo
%a = ( x => 5, y => 3, z => 'abc' ); @v = values %a # @v se instancia con con ( 5, 3, 'abc' );

La funcin exists prueba si existe una clave en un arreglo asociativo


%a = ( x => 5, y => 3, z => 'abc' ); $b = exists $a{z}; # $b se instancia con 1, es verdadero $c = exists $a{w}; # $c queda con "", es falso

Es posible ordenar una estructura. Para Perl existen tres formas: por orden ASCII, numericamente o alfabeticamente.
%hash = (Apples=>1, apples=>4, artichokes=>3,Beets=> 9,); foreach my $key (sort keys %hash) { print "$key = $hash{$key}\n"; }

La salida ser Apples = 1 Beets = 9 apples = 4 artichokes = 3 A los efectos ordenar alfabeticamente se puede utilizar la funcin lc (convertir a minsculas) y el operador de comparacin cmp.
foreach my $key (sort {lc($a) cmp lc($b)} keys %hash) { print "$key = $hash{$key}\n"; }

Hash Slices: Un slice es un subconjunto de datos de una lista, arrreglo un hash. Utilizando slices es posible agregar o borrar pares de clave-valor en masa.
@meses = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); @num_meses{@meses}= 1..$#meses+1; foreach my $key (keys %num_meses) { print "$key = $num_meses{$key}\n";

11

Universidad Nacional de Lujn - Gua del lenguaje Perl

En el ejemplo anterior a partir de la lista meses se construyo el hash num_meses El siguiente cdigo permite listar los pares clave-valor ordenados por valor
foreach my $key (sort {$num_meses{$a} <=> $num_meses{$b}} keys %num_meses){ print "$key = $num_meses{$key}\n"; };

Es posible definir distintas formatos de ordenamiento utilizando un puntero de reemplazo. El siguiente ejemplo muestra la tcnica de uso de subrutinas para ayudar al ordenamiento. Ejemplo:
foreach my $key (sort ascend_alpha keys %hash){ print "$key = $hash{$key}\n"; } sub sub sub sub sub sub ascend_num descend_num ascend_alpha descend_alpha ascend_alphanum descend_alphanum {$a <=> {$b <=> {lc($a) {lc($b) {$a <=> {$b <=> $b} $a} cmp lc($b)} cmp lc($a)} $b || lc($a) cmp lc($b)} $a || lc($b) cmp lc($a)}

Referencias a hashes
$hashref = \%hash; foreach my $key (sort ascend_alpha keys %{$hashref}){ print "$key = $hashref->{$key}\n"; }

En el bloque se utiliza la referencia ($hashref) al hash Hashes multidimensionales: Se utilizan para asociar mas de un valor a la clave, el ejemplo siguiente lo muestra
%hash = ( Apples "Canadian Bacon" artichokes Beets "5 Spice Seasoning" "10 Star Flour" "911 Hot Sauce" ); => => => => => => => [4, [1, [3, [4, [1, [1, [1, "Delicious red", "medium"], "package", "1/2 pound"], "cans", "8.oz."], "cans", "8.oz."], "bottle", "3 oz."], "package", "16 oz."], "bottle", "8 oz."],

Para extraer un valor particular, al conjunto de valores debe tratarselo como un arreglo.
print $hash{"Canadian Bacon"}[1];

La instruccin anterior mostrar por pantalla el valor package que es el segundo elemento. Es posible asignar un arreglo a un valor de clave.
@garlicstuff = (4, "cloves", "medium"); $hash{"Garlic"} = [@garlicstuff]; print $hash{"Garlic"}[1]; # Imprime cloves

12

Universidad Nacional de Lujn - Gua del lenguaje Perl

Es posible asociar arreglos de longitud variable a una misma estructura hash. El siguiente programa permite imprimir un hash con arreglos de distinta longitud asociados a las claves.
foreach my $key (sort ascend_alpha keys %hash){ print "$key: \n"; foreach my $val (@{$hash{$key}}){ print "\t$val\n"; } print "\n"; }

13

Universidad Nacional de Lujn - Gua del lenguaje Perl

Operadores
" No puedo decir que no estoy en desacuerdo contigo". Groucho Marx

En Perl los valores falsos son: En cadenas "" y "0" En nmeros, el nmero 0. El valor "no definido", cuando una variable existe, pero no tiene valor ligado Todos los demas valores son verdaderos Los operadores clsicos son: Operacin Mayor que Menor que Mayor o igual Menor o igual Igual Diferente Compara Para aritmtica > < >= <= == != <=> Para cadenas gt lt ge le eq ne cmp

El operador compara retorna un valor de -1, 0 o 1 dependiendo si el valor a la izquierda es menor, igual o mayor que el de la derecha del operador. Perl considera como verdaderos los valores no nulos (cadenas) y diferentes de cero. Algunos operadores lgicos que permiten determinar el valor de verdad de una expresin son: Operador ! ~ && || & | ^ .. not and or xor Funcin Negacin Lgica Inverso aditivo (cambia el signo de un numero) Negacin Bit a bit de un valor AND - Conjuncin lgica de los operandos OR - Disyuncin lgica de los operandos AND - Conjuncin bit a bit de los operandos OR - Disyuncin bit a bit de los operandos XOR - Or exclusiva bit a bit Si evaluado como escalar regresa alternativamente verdadero y falso. Como arreglo genera un arreglo a partir de los limites de un rango. Negacin lgica de la expresin a su izquierda (sinnimo de baja prioridad) Conjuncin lgica (sinnimo de baja prioridad) Disyuncin (sinnimo de baja prioridad) Disyuncin exclusiva lgica (sinnimo de baja prioridad))

14

Universidad Nacional de Lujn - Gua del lenguaje Perl

Ejemplo:
if ( $a and $b ) { print "A y B son verdaderos"; } # $a y $b han sido definidas if ( $a or $b ) { print "A o B son verdaderos"; } # $a y/ $b han sido definidas

Existen los operadores && y || (como en el lenguaje C) y poseen mas prioridad que and y or. comparacin de nmeros
$x = $a <=> $b # $x queda con -1 si $a < $b # $x queda con 0 si $a == $b # $x queda con 1 si $a > $b

comparacin de strings
$x = $a cmp $b # $x queda con -1 si $a lt $b # $x queda con 0 si $a eq $b # $x queda con 1 si $a gt $b

As como los operadores aritmticos fuerzan a la variable a comportarse como de tipo entero o real, los operadores de cadena fuerzan a los escalares a comportarse como cadenas, de modo que los nmeros son automticamente convertidos en cadenas al aplicarles estos operadores. Si una variable est indefinida, al ser evaluada da una cadena vaca, lo cual significa falso. Para definirla, se puede aplicar la siguiente tcnica:
$costo = 100 unless $costo; # Si costo no esta definido, inicializarlo con 100

La funcin defined se utiliza para averiguar si una variable esta definida


$a = 5; print "variable a definida" if (defined $a); print "variable b no definida" if (!defined $b); $costo = 100 unless defined($costo); # Acuerdese que lo que est a la izquierda # de unless se ejecuta si la expresin de # la derecha da falso.

Nota: la funcin undef lo que hace es desligar un valor de una variable. Las operaciones a realizar con cadenas, por lo regular se manejan como funciones en vez de como operadores, con la excepcin de las siguientes: Operador
.

Funcin
Concatenacin, todas las cadenas operadas por "." forman una sola cadena. $a = "Hola"; $b = "mundo"; $c = $a." ".$b;

Operador de repeticin, en contexto escalar toma cadena de izquierda y la repite el numero de veces que el numero de derecha indica. En contexto de una lista, toma la lista a izquierda y la repite las veces que indica el operador a derecha en una nueva lista. $bar = '-' x 72; # devuelve una cadena de 72 guiones.

la la su su

15

Universidad Nacional de Lujn - Gua del lenguaje Perl

++

Autoincremento, modifica el valor de los elementos de una de modo que se incrementen sin cambiar su naturaleza.

cadena

Por ejemplo ++"zzz" da "aaaa"; ++"99" da "100" , ++"a9" da "b0". .. Operador que permite definir rangos. Por ejemplo: @a = "ay" .. "bb"; @a queda con ("ay", "az", "ba", "bb") @a = 1..5; @a queda con (1, 2, 3, 4, 5)

16

Universidad Nacional de Lujn - Gua del lenguaje Perl

Estructuras de Control
"Por qu las cosas son como son y no de otra manera?" Blaise Pascal

Las estructuras principales de Perl y su sintaxis son: IF: if (EXPRESIN) BLOQUE if (EXPRESIN) BLOQUE else BLOQUE if (EXPRESIN) BLOQUE elsif (EXPRESIN) BLOQUE ... else BLOQUE WHILE: while (EXPRESIN) BLOQUE do BLOQUE until | while (EXPRESIN) FOR: for (EXPRESION;EXPRESION;EXPRESION) BLOQUE FOREACH: foreach VARIABLE (LISTA) BLOQUE Donde: BLOQUE es un conjunto de comandos agrupados por los caracteres {} EXPRESION es una proposicin lgica que evaluada devuelve un valor de verdad. LISTA es un conjunto de valores separados por coma. Ejemplo if

Ejemplo:
$objeto = "tiza"; $requerido = "tiza"; $cantidad = 22; if ($objeto eq "tiza") { print "la variable objeto esta instanciada con } else { } print "la variable objeto NO esta instanciada con tiza\n"; tiza\n";

if ($cantidad <= 25) {print "Hay que reponer ".((25-$cantidad)*3). " elementos\n";}

Ejemplo if-elsif-else Si la primer expresin es verdadera ejecutar bloque, de lo contrario evaluar las expresines elsif, si alguna es verdadera ejecutar bloque correspondiente, si finalmente se obtiene falso ejecutar bloque definido en else

17

Universidad Nacional de Lujn - Gua del lenguaje Perl

Ejemplo:
#!/usr/local/bin/perl print ("Ingrese el dividendo:\n"); $dividendo = <STDIN>; chop ($dividendo); print ("Ingrese el divisor:\n"); $divisor = <STDIN>; chop ($divisor); if ($divisor == 0) { print ("Error: no puedo dividir por cero!\n"); } elsif ($dividendo == 0) { $resultado = $dividendo; } elsif ($divisor == 1) { $resultado = $dividendo; } else { $resultado = $dividendo / $divisor; } if ($divisor != 0) { print ("El resultado es ", $resultado, "\n"); }

Ejemplo unless La entructura unless, equivale a la negacin de if, es decir que si la condicin de unless da por resultado falso se ejecutan las intrucciones del bloque. Ejemplo:
#!/usr/local/bin/perl print "Ingrese el nombre de un sistema operativo: "; chop($nombre=<STDIN>); # no toma el ultimo caracter ingresado if($nombre=="linux") { print "Ese si es un buen producto "; } else { print "Le pedi que ingresara un nombre de sistema operativo"; } #!/usr/local/bin/perl print "Escriba un numero menor o igual a 10: "; chop($numero=<STDIN>); unless($numero <= 10) { print "Error $numero no es menor igual a 10"; }

Ejemplo while Ejecutar bloque siempre que el resultado de la evaluacin de la expresin sea verdadero Ejemplo:
#!/usr/local/bin/perl $i=0; $suma=0; while($i<10) { $suma = $suma+$i; $i++ } print "El resultado de la suma es: $suma";

18

Universidad Nacional de Lujn - Gua del lenguaje Perl

Ejemplo do while

Ejemplo:
#!/usr/local/bin/perl

do { $linea = <STDIN>; } while ( $linea ne "\n" );

Ejemplo until

Ejemplo:
#!/usr/local/bin/perl $i=0; $suma=0; until($i != 10) { $suma= $suma + $i; $i++ } print "El resultado de la suma es: $suma";

Ejemplo do until

Ejemplo:
#!/usr/local/bin/perl

do { $linea = <STDIN>; } until ($linea eq "\n");

Ejemplo for Itere mientras la condicin no se cumpla. Ejemplo:


#!/usr/local/bin/perl

19

Universidad Nacional de Lujn - Gua del lenguaje Perl

$suma=0; for($i=0; $i<10; $i++) { $suma = $suma + $i } print "El resultado de la suma es $suma \n";

Ejemplo foreach Itera la cantidad de elementos que haya en la lista de datos, en cada vuelta toma el ensimo elemento y lo asigna a una variable. Ejemplo:
#!/usr/local/bin/perl @lista = (7, 11, 22, 5, 6, 7, 45); foreach $elemento (@lista) { print $elemento." "; }

Ejemplo last y next En Perl, la instruccin last se utiliza para forzar la finalizacin de un ciclo while . En cambio la instruccin next fuerza inmediatamente a la evaluacin de la condicin, saltando las siguientes instrucciones del bloque. Ejemplo:
#!/usr/local/bin/perl $total = 0; while (1) { $linea = <STDIN>; if ($linea eq "\n") {last} # Ingresar n nmeros por lnea, el # separador es el tabulador # last indica que se debe finalizar el # ciclo while en caso de que se ingrese # una lnea vacia

chop ($linea); @numeros = split("\t", $linea); # Extraer los n nmeros ingresados foreach $num (@numeros) { # validar si cada elemento es un nmero

if ($num =~ /[^0-9]/) {print "$num no es un nmero\n"} $total += $num; } } print "La suma de los nmeros ingresados es $total \n";

Ejemplo:
#!/usr/local/bin/perl @arreglo = (0..9);

20

Universidad Nacional de Lujn - Gua del lenguaje Perl

print("@arreglo\n"); for ($indice = 0; $indice < @arreglo; $indice++) { if ($indice == 3 || $indice == 5) { next; } $arreglo[$indice] = "*"; } print("@arreglo\n");

21

Universidad Nacional de Lujn - Gua del lenguaje Perl

Funciones y subrutinas
" No creo en una vida posterior, pero por si acaso me he cambiado de ropa interior". Woody Allen

Perl no hace diferencias entre funciones y subrutinas. Una funcin se define:


sub mifuncin { print "Soy una funcin \n"; }

y se la invoca:
&mifuncion;

Si se quieren enviar y recibir parmetros:


sub maximo { if ($_[0] > $_[1]) { return($_[0]); } else { return($_[1]); } # Por defecto en el arreglo $_ se almacenan los # parmetros recibidos

$a = 22; $b = 55; $mayor = &maximo($a, $b);

Por defecto, si no se especifica el valor a devolver con return, el valor retornado por la funcin es el ltimo valor evaluado dentro de su bloque.
sub saludar { print "Hola $_[0]!\n"; } saludar("Cesar"); saludar("Sandra");

El pasaje de parmetros, realizado en el siguiente ejemplo es por referencia, es decir que se envan un punteros indicando la direccin de memoria donde estn los datos. Si dentro de la funcin se modificara algn valor sobre los parmetros pasados, se modificaran las variables originales. Luego de ejecutar el siguiente programa, muestre los valores de $a, $b y saque sus propias conclusiones.
sub maximo { ($_[0], $_[1]) = ($_[1], $_[0]); # se realiza un swap if ($_[0] > $_[1]) { return($_[0]); } else { return($_[1]); } } $a = 22; $b = 55; $mayor = &maximo($a, $b);

22

Universidad Nacional de Lujn - Gua del lenguaje Perl

Variables locales Una variable declarada con "my" es local en el mbito de la subrutina. Se aconseja la prctica de copiar los argumentos a variables locales. Con esto se consiguen dos efectos: darles nombres ms significativos, y hacer que el traspaso sea por valor (el default es por referencia).
sub suma { my($a,$b) = @_; } $a+$b;

# @_ es la lista de los parmetros recibidos # se podra haber devuelto el resultado # con la funcin return

print &suma(2,3)."\n";

Si se tiene un nmero variable de parmetros se los podra recibir en una lista local.
print &suma(3,35,22,5)."\n"; print &suma(1..8)."\n"; sub suma {

my @lista = @_; my $x, my $s = 0; foreach $x (@lista) return($) { $s += $x; } # += suma a $s y asigna }

Ejemplo: Multiplicacin por medio de sumas sucesivas


#!/usr/bin/perl # programa principal if(!defined($ARGV[1])) {die "Uso: multiplica.pl x y"} $x = $ARGV[0]; $y = $ARGV[1]; $z = &multiplica ($x, $y); print "El resultado de $x * $y es $z\n"; # subrutina sub multiplica { local( $x ) = @_[0]; local( $y ) = @_[1]; local( $z ) = 0; local( $i ); for ( $i = 1; $i <= $y; $i++ ) { $z = $z + $x; }; }; return $z;

23

Universidad Nacional de Lujn - Gua del lenguaje Perl

Ejemplo: Verificar si un nmero es primo


#!/usr/bin/perl # programa principal if(!defined($ARGV[0])) {die "Uso: primo.pl x"} $x = $ARGV[0]; if ( &primo( $x ) ) { print "$x es un numero primo\n"; } else { print "$x no es un numero primo\n"; }; # subrutina sub primo { local( $x ) = @_[0]; local( $primo ) = 1; local( $i ) = 2; local( $j ); while ( ( $i < $x ) && $primo ) { $j = int( $x / $i ); $j = $x - ( $j * $i ); if ( $j == 0 ) { $primo = 0; } else { $i++; };

}; };

return $primo;

Recursividad Ejemplo: Clculo de la potencia


#!/usr/bin/perl # programa principal if(!defined($ARGV[1])) {die "Uso: potencia.pl x y"} print $ARGV[0]." a la ".$ARGV[1]." = ".&potencia($ARGV[0],$ARGV[1])."\n"; # subrutina sub potencia {

local($a,$n) = @_; if( $n == 0 ) {

24

Universidad Nacional de Lujn - Gua del lenguaje Perl

1; } elsif( $n%2 == 1 ) { $a*potencia($a,$n-1); } else { potencia($a*$a,$n/2); } }

Factorial
$x = $ARGV[0]; $fatt = &fatt( $x ); print "$x! = $fatt\n"; sub fatt { local( $x ) = @_[0]; if ( $x > 1 ) { return ( $x * &fatt( $x - 1 ) ); } else { return 1; }; };

Paquetes y Mdulos En ciertas ocasiones, los programas que se construyen son demasiado grandes por una cuestin de organizacin interesa poder dividir el cdigo en fragmentos ms pequeos, que se puedan reutilizar. Perl proporciona dos soluciones: Paquete: Es el equivalente a la instruccin #include del lenguaje C, se pueden tener funciones por separado, pero al ejecutarse se juntar todo en un nico script. Un dato importante que debe tenerse en cuenta al construir un archivo tipo paquete es no olvidar incluir como ltima lnea una sentencia cuyo valor lgico sea cierto. La forma ms comn de conseguirlo es que figure al final del mismo la lnea 1; Paquete suma
sub suma { local($a,$b)=@_; $a+$b; } 1;

Programa ejemplo.pl
require "suma"; # Se carga el paquete suma $resultado = &suma(5, 2); print "El resultado es $resultado \n";

Mdulos: Los mdulos son elementos ms avanzados que los paquetes, son una especie de libreras y pueden cargarse de forma dinmica. Este tema no es objetivo de este documento.

25

Universidad Nacional de Lujn - Gua del lenguaje Perl

Referencias
"No debe haber barreras para la libertad de preguntar. No hay sitio para el dogma en la ciencia. El cientfico es libre y debe ser libre para hacer cualquier pregunta, para dudar de cualquier aseveracin, para buscar cualquier evidencia, para corregir cualquier error. Mientras los hombres sean libres para preguntar lo que deben; libres para decir lo que piensan; libres para pensar lo que quieran; la libertad nunca se perder y la ciencia nunca retroceder" Glenn Theodore Seaborg, fsico estadounidense

Las referencias son escalares que almacenan la direccin de memoria de otra variable. Para visualizar tal concepto pruebe:
$a = "Hola Mundo"; print $a."\n"; # se muestra el contenido de $a print \$a."\n"; # se muestra el puntero a $a, es decir la direccin de memoria de $a

Otras referencias:
$refa $refb $refc $refx = = = = \$a; \@b; \%c; \$rb; # # # # referencia referencia referencia referencia a a a a escalar arreglo arreglo asociativo referencia

Arreglos annimos construidos por referencias Se crea un arreglo sin nombre (observe el parentesis recto)
$refb = [ 'd1', 'd2', 'd3']; # en refb se almacena la referencia al arreglo sin nombre

Idem, pero con un arreglo asociativo


$refc = { c1 => 'd1', c2 => 'd2' }; # en refc se almacena la referencia al arreglo asociativo sin nombre

Utilizando una referencia a una referencia se obtiene el dato real


$ra $rb $rc $rx = = = = \$a; \@b; \%c; \$rb; es es es es # # # # la la un la referencia referencia referencia referencia a a a a escalar arreglo hash referencia $ra... $rb... apunta $rc... el valor de $a el valor de @a a un escalar el valor de %c

${$ra} @{$rb} @{$ra} %{$rc}

desreferencia de desreferencia de error porque $ra desreferencia de

Ejemplo: Bsqueda secuencial de un entero en una lista


#!/usr/bin/perl # Programa principal if(!defined($ARGV[0])) {die "Uso: buscarseq.pl x"} $x = $ARGV[0]; @lista = (0..100);

26

Universidad Nacional de Lujn - Gua del lenguaje Perl

$i = &busqueda_secuencial(\@lista, $x); print "\nEl elemento $x estaba en la posicin $i\n"; # Procedimiento &busqueda_secuencial( <puntero_a_lista>, <numero_a_buscar> ) sub busqueda_secuencial { local($lista) local($x) local($i); = @_[0]; = @_[1];

for ( $i=0; $i<=$#{$lista}; $i++ ) { print $listas[$i]." ".$xx; if ( $x == ${$lista}[$i] ) { return $i; }; }; # El nmero no estaba en la lista return -1;

};

Veamos una manera de accesar los elementos de un hash usando una referencia
$rc = { a => 1, b => 2 }; # $rc es una referencias a un hash annimo print $rc->{a}; # imprime: 1

La funcin ref devuelve un string que indica el tipo del referenciado


$ra $rb $rc $rx $rf ref ref ref ref ref = = = = = ( ( ( ( ( \$a; \@b; \%c; \$rb; \&f; $ra $rb $rc $rx $rf ); ); ); ); ); # # # # # # # # # # referencia referencia referencia referencia referencia devuelve devuelve devuelve devuelve devuelve a a a a a escalar arreglo hash referencia funcin

"SCALAR" "ARRAY" "HASH" "REF" "CODE"

Si el operando de ref no es una referencia, ref devuelve falso "no definido" Diferencia entre trabajar con variables y trabajar con referencias...
$a = 5; $b = $a; # $b recibe una copia del valor de $a $a = 7; print # cambio el valor de $a "$a $b\n"; # imprime: 7 5 # un cambio en $a no afecta a $b

$a = 5; $ra = \$a; $rb = $ra; $a = 7; # cambio el valor de $a print "$a $$ra $$rb \n" ; # imprime 7 7 7

27

Universidad Nacional de Lujn - Gua del lenguaje Perl

# las referencias si comparten en mismo valor... # el valor 7 aqui tiene 3 usuarios...

Expresiones Regulares
" Claro que lo entiendo. Incluso un nio de cinco aos podria entenderlo. Que me traigan un nio de cinco aos!" Groucho Marx

Una expresin regular es una forma de expresar gramaticalmente la estructura de cualquier cadena alfanumrica. Una expresin regular es un patrn que se compara con una cadena de caracteres. Esta comparacin es conocida con el nombre de pattern matching o reconocimiento de patrones, permite identificar las ocurrencias del patrn en los datos tratados. Las expresiones regulares en Perl se utilizan para la bsqueda, modificacin y extraccin de cadenas de caracteres. De esta manera se pueden dividir las expresiones regulares en varios tipos que son: expresiones regulares de de comparacin, sustitucin y de traduccin. m// s// tr// Coincidencia (match) (la m puede obviarse) sustituir traducir Ejemplos
if($texto =~ m/unlu/) { print "el escalar texto contiene la cadena unlu"} $copia =~ s/copy/copia/g; # Si en la cadena $copia aparece la palabra # copy se reemplaza por copia $entrada =~ tr/A-Z/a-z/; # Convierte a minsculas la cadena $entrada

Metacaracteres \ ^ $ | Caracter de escape (Ej. \t tabulador, \" comillas) Coincidencia al inicio Coincidencia al final O lgico

Constructores Contruccin \d \D \w \W \s \S [a|b|c] Significado Un dgito Cualquier cosa que no sea digito Un carcter alfanumrico Cualquier cosa que no sea un carcter alfanumrico Un espacio, retorno de carro, tabulador, etc Cualquier cosa que no sea un espacio, etc Cualquier linea que contenga la letra 'a', 'b' o 'c' Contrucciones equivalentes [0-9] [^0-9] [a-zA-Z0-9] [^a-zA-Z0-9] [ \n\r\t\f] [^ \n\r\t\f] [a-c]

Cuantificadores

28

Universidad Nacional de Lujn - Gua del lenguaje Perl

. ? * + Operadores g i o Ejemplos

Unnico caracter Coinicidencia de 0 1 vez. Coinicidencia de 0 ms veces Coinicidencia de 1 ms veces

Reemplaza todas las ocurrencias Chequeo no sensitivo Evalua la expresin a reemplazar una sola vez

Verificar si una cadena est contenida en otra


$_ = "Hola Mundo!!!"; print "Si ola esta contenida\n" if (/ola/); if($texto =~ /unlu/) { print "el escalar texto contiene la cadena unlu"} if($texto =~ /unlu/) { print "el escalar texto contiene la cadena unlu"} # comparacin no sensitiva if($texto !~ /unlu/) { print "el escalar texto NO contiene la cadena unlu"}

Verificar si una subcadena est al comienzo de otra cadena


$a = "Universidad Nacional de Lujn"; if ($a =~ /^Uni/){# cdigo a ejecutar en caso de que la expresin sea verdadera}

al final
if ($a =~ /jn$/) {# cdigo a ejecutar en caso de que la expresin sea verdadera}

Reemplaza copy con copia a lo largo de la cadena $copia


copia ="copy, xcopy, diskcopy"; $copia =~ s/copy/copia/g; # El contenido de la variable $copia ser: "copia, xcopia, diskcopia"

Elimina caracteres
$cadena = "abcdef"; $cadena = s/cd//; print $cadena; # Imprime: abef

El patrn de traduccin (tr) permite modificar el contenido de una variable. En el siguiente ejemplo se reemplaza la lectra c por 1, la o por 2, la p con 3, la y con 4 y el 5 se ignora.
$copia ="copy, xcopy, diskcopy"; $copia =~ tr/copy/12345/; # El contenido de la variable $copia ser: "1234, x1234, disk1234"

Conversin a minsculas

29

Universidad Nacional de Lujn - Gua del lenguaje Perl

$entrada = "La Casa de Ana"; $entrada =~ tr/A-Z/a-z/; # Convierte a minsculas print $entrada."\n";

La siguiente expresin regular acepta solo nmeros


$variable = "1a2b3c"; $variable =~ tr/0-9//cd; print $variable."\n";

Reemplaza el caracter = con un espacio


$a = "f1=abc test=on"; $a = tr/=/ / ; # $a queda "f1 abc test on"

La siguiente expresin reemplaza cada "a" por "e", cada "b" por "d" y cada "c" por "f" en la cadena $cadena:
$cadena = "cabeza"; $cabeza =~ tr/abc/edf/; print $cadena."\n"; Imprime fedeze

La siguiente expresin retorna el nmero de sustituciones hechas. Se cuentan el nmero de asteriscos en la cadena $cadena:
$cadena = "Si no *** fuera * por la * suerte *"; $contador = ( $cadena =~ tr/*/*/ );

Otros ejemplos
una "d" seguida de un caracter cualquiera y una "l" (del, dal, dzl, d5l, etc) una "f" al principio de la cadena (fofo, farfolla, f35, ^f etc) "hola" al principio de la cadena (hola, holita, etc) ^hol una "e" al final de la cadena (este, ese, etc) e$ "te" al final de la cadena (este, paquete, etc) te$ "in" seguido de cero o ms caracteres "d" (in, ind, indd, ind* etc) cualquier cadena, sin retorno de carro .* una cadena vacia ^$ una "q", o una "j" o una "k" [qjk] no sea "q", o una "j" o una "k" [^qjk] cualquier letra entre la "a" y la "z" [a-z] no sean letras minsculas [^a-z] una letra minscula o mayscula [a-zA-Z] una secuencia no vacia de letras minsculas [a-z]+ coincide con "fca", "foca", "flaca", "flor vaca", etc f.*ca coincide con los anteriores salvo con "fca" f.+ca coincide con "fa" y "fea" fe?a una linea en blanco, o combinaciones de espacios y ^[ \t]*$ tabuladores [-+]?\d*\.?\d* lo mismo que [-+]?[0-9]*\.?[0-9]* (nmeros decimales) o "pepe" o "juan" pepe|juan o "pecos" o "huecos" (pe|hue)cos o da o dada o dadada ... (da)+ un "0" o un "1" [01] coincida con "fia", "fea" o "fua" fia|fea|fua coincida con "fia", "fea" o "fua" f(i|e|u)a d.l

30

Universidad Nacional de Lujn - Gua del lenguaje Perl

31

Universidad Nacional de Lujn - Gua del lenguaje Perl

Archivos
"La ciencia son hechos; de la misma manera que las casas estn hechas de piedras, la ciencia est hecha de hechos; pero un montn de piedras no es una casa y una coleccin de hechos no es necesariamente ciencia." Alfred North Whitehead, matemtico ingls.

Entrada estandard Para leer una linea desde la entrada estandard se debe asignar una variable escalar a <STDIN>
$a=<STDIN>; chop($a); # guarda en $a la linea leida # se saca el enter que tiene la linea ingresada

Como procesar toda la entrada estandar:


while ( $a=<STDIN> ) { bloque de procesamiento ; }

Se leen una serie de lneas ingresadas por teclado y se las almacenan como elementos de un arreglo.
print "Ingrese varias lneas de texto <Ctrl-Z para finzalizar>\n"; @l = <STDIN>; # las lneas se almacenan como elementos de un arreglo print "\n"; foreach $i (@l) {print "*".$i}

Archivos perl Perl accede a los archivos por medio de manejadores de archivos. Los archivos se abren mediante la instruccin open que admite dos argumentos, un manejador de archivo y un nombre de archivo:
open(PUNTERO, "<modo de acceso><nombre de archivo>");

El argumento nombre puede estar asociado a una serie de prefijos que indiquen la modalidad de acceso, por ejemplo: >> indica modo aadir (append). La siguiente tabla muestra los modos existentes Modo < > >> | +> +< Descripcin Abrir para lectura (por defecto) Abrir en modo grabacin. Si el archivo existe se borrar todo su contenido. Abrir en modo aadir, a los efectos de grabar al final del archivo La salida de una script se redireccciona al programa. Abre un archivo en modo lecturaescritura, si el archivo no existe lo crear. Abre un archivo en modo lecturaescritura, si el archivo no existe reportar error.

32

Universidad Nacional de Lujn - Gua del lenguaje Perl

Existen dos archivos que no requieren abrirse ni cerrarse, y son la entrada (manejador STDIN) y la salida standar (manejador STDOUT). El lenguaje Perl no necesita que se mencionen explcitamente, en lugar de ello, los crea y les asigna canales automticamente. Leer registros EL operador <manejador_de_archivo> permite leer registros de un archivo. El siguiente ejemplo indica como acceder al contenido del archivo datos.dat, pasar a minsculas sus letras y guardar el resultado en el archivo salida.dat
open(IN, "datos.dat"); open(OUT, ">salida.dat"); while(<IN>) { # # # # se el se el abre para manejador abre para manejador lectura el archivo datos.dat, IN lo referencia grabacin el archivo salida.dat, OUT lo referencia

# mientras no sea fin de archivo lee un registro

$linea = $_; # el registro leido se guarda en la variable linea $linea =~ tr/A-Z/a-z/; # se pasan a minsculas todas las letras print OUT $linea; } close(IN); close(OUT); # se graba la linea en el archivo de salida

Ntese que el comando close se utiliza a los efectos de cerrar un archivo. Funcin die La funcin die es til para finalizar la ejecucin de un programa ante la existencia de errores de ejecucin. En el siguiente ejemplo si fallar la apertura del archivo el operador or (||) disparar la ejecucin de la funcin die que interrumpir la ejecucin del programa y mostrar un mensaje de error.
$archivo = "datos.dat"; open(INPUT, $file) @lineas = <INPUT> || die "no se puede abrir el archivo\n"; # Notese que leer todo el archivo. y lo almacena # en un arreglo

close(INPUT);

Pipes En el modo de apertura de un archivo, el caracter | (pipe) es utilizado a los efectos de ejecutar un comando externo y redireccionar su salida al programa Perl. Cuando el nombre del archivo lleva como prefijo el carcter |, este nombre se trata como una orden de ejecucin. Tal orden se ejecuta y su salida es tomada como un archivo. Ejemplo:
open(WHO, "|who"); while($who = <WHO>) { # determina los usuarios de un sistema

chop ($who); # elimina el caracter de retorno de carro ($user, $tty, $junk) = split(/\s+/, $who, 3); print "El usuario $user est en la terminal $tty\n"; } close(WHO);

Operadores de comprobacin de archivos

33

Universidad Nacional de Lujn - Gua del lenguaje Perl

Aportan distintas informaciones sobre un archivo, por ejemplo el operador -A devuelve la ltima fecha de acceso. La siguiente tabla muestra los operadores ms comunes: Operador -A -e -r -w -x -M Por ejemplo:
$archivo = "datos.dat"; if (e- $archivo) { # El archivo existe } else {print "el archivo $archivo no existe.\n"; }

Descripcin Fecha de ltimo acceso El archivo o directorio existe El archivo existe y se tienen permisos para acceder El archivo es modificable El archivo es ejecutable Fecha de ltima modificacin

Grabacin A los efectos de grabar sobre un archivo secuencial se usa la instruccin print y a continuacin el manejador de archivo que indica el archivo sobre el cual se desea grabar. Ejemplo
open(SALIDA, ">>datos.dat"); # se abre el archivo en modo aadir print SALIDA "346\tPerez, Jorge\tSan Luis 347\n"; close(SALIDA);

Fijese que en el ejemplo anterior se grab un registro (tres campos separados por tabulador) sobre el archivo datos.dat. Como en C se puede utilizar la instruccin printf a los efectos de aplicarle mscaras de formato a los datos a grabar.
Programa que chequea #!/usr/local/bin/perl unless (open(FILE, "miarchivo.txt")) { if (-e "file1") { die ("El archivo existe, no puede ser abierto.\n"); } else { die ("El archivo no existe.\n"); } } $linea = <FILE>; while ($linea ne "") { chop ($linea); print ("\U$linea\E\n"); $line = <FILE>; } si un archivo existe y est disponible

El siguiente programa es un ejemplo de lectura y grabacin sobre archivos secuenciales. La script determina que se debe leer el archivo secuencial(catalg.lin) y copiar su contenido al archivo secuencial sucopia.lin, traduciendo los caracteres alfabticos de maysculas a minsculas.
open(IN, "catalg.lin"); open(OUT, ">sucopia.lin"); while(<IN>) { # # # # se el se el abre para manejador abre para manejador lectura el archivo catalg.lin IN lo referencia grabacin el archivo sucopia.lin OUT lo referencia

# mientras no sea fin de archivo lee un registro

34

Universidad Nacional de Lujn - Gua del lenguaje Perl

$linea = $_; # el registro leido se guarda en la variable linea chop($linea); $linea =~ tr/A-Z/a-z/; # se pasan a minsculas todos los caracteres alfabticos print OUT $linea."\n"; # se graba la linea en el archivo de salida } close(IN); close(OUT);

Funciones para manejo de archivos read(manejador, variable, longitud, [desplazamiento]) Esta funcin lee desde un archivo, 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 archivo se empieza a leer. Por defecto, es la posicin donde se encuentra el puntero. He aqu algunos ejemplos:
open(INPUT,"<datos.dat"); read(INPUT, $var, 60); # $var almacena los primeros 60 bytes del archivo

Programa destinado a leer un archivo relativo (catalg.rel) y mostrar por pantalla sus registros. La estructura del archivo es la siguiente:
Longitud de registro: 50 bytes Campos ID-articulo 4 bytes (de byte 0 a articulo 18 bytes (de byte 4 a marca 8 bytes (de byte 22 a pais origen 8 bytes (de byte 30 a meses garantia 2 bytes (de byte 38 a stock 3 bytes (de byte 40 a precio 7 bytes (de byte 43 a 3) 21) 29) 37) 39) 42) 49)

$linea = '-'x57; print "$linea\n"; open(DAT,"<catalg.rel"); while(not(eof(DAT))) { read(DAT, $buffer, 50); #Lee 50 bytes del archivo DAT y almacena su #contenido en una variable de memoria # denominada buffer

&parsing_e_imprime(); #Extrae contenido de los campos a variables # de memoria e imprime } print "$linea\n"; close(DAT); sub parsing_e_imprime { $id_articulo = substr($buffer,0,4 ); $articulo = substr($buffer,4,18); $marca = substr($buffer,22,8);

35

Universidad Nacional de Lujn - Gua del lenguaje Perl

$pais $garantia $stock $precio print

= = = =

substr($buffer,30,8); substr($buffer,38,2); substr($buffer,40,3); substr($buffer,43,7);

"|".$id_articulo."|". $articulo."|". $marca."|". $pais."|". $garantia."|". $stock."|". $precio."|\n"; # Imprime registro

return;

seek(manejador, posicin, referencia) Seek mueve pone el puntero de archivo a la posicin especificada (valores positivos avanzan y negativos retroceden) El desplazamiento indicado por el parmetro posicin se puede hacer desde el principio del archivo, desde la posicin del puntero actual del archivo o desde el fin del archivo. Esto lo determina el parmetro referencia con los valores 0,1 y 2 respectivamente. Ejemplo:
open(INPUT,"<datos.txt"); read(INPUT, $variable, 22); seek(INPUT,-23,1); read(INPUT, $variable, 22); seek( MIOFILE, 0, 2 ); Posiciona el puntero al final del archivo seek( MIOFILE, 0, 0 ); Posiciona el puntero al inicio del archivo

# se retorna al inicio # se vuelve a leer lo mismo

tell(manejador) Funcin que retorna la posicin del puntero en el archivo especificado en el parmetro manejador. Ejemplo:
open(INPUT,"<datos.txt"); read(INPUT, $variable, 30); $puntero = tell(INPUT); # $puntero almacena 31;

Script que modifica un registro del archivo relativo catalg.rel. Se accede al registro 3 y se modifica el contenido del campo pais de origen
open(DAT,"+<catalg.rel"); $ptro_archivo = tell(DAT); print "Al abrir el puntero de archivo esta en la posicion $ptro_archivo\n"; seek(DAT,100,1); $ptro_archivo = tell(DAT); print "Se movio el puntero de archivo al inicio del 3er registro ($ptro_archivo)\n"; read(DAT, $buffer, 50); #Lee el 3er registro y almacena su contenido #en una variable denominada buffer &parsea_e_imprime(); $pais = "TURKIA "; $buffer = $id_articulo.$articulo.$marca.$pais.$garantia.$stock.$precio; seek(DAT,100,0); syswrite(DAT, $buffer, 50); #Regraba el 3er registro

36

Universidad Nacional de Lujn - Gua del lenguaje Perl

# Lee nuevamente e imprime el contenido del 3er registro seek(DAT,100,0); read(DAT, $buffer, 50); &parsing_e_imprime(); close(DAT);

eof(manejador) Funcin que retorna verdadero (1) si el archivo especificado por el parmetro manejador tiene el puntero en el final del mismo.
open(INPUT,"<datos.txt); while (!(eof(INPUT))) { $linea = <INPUT>; print $nombre; }

getc(manejador) La funcin getc lee caracteres, de a uno por vez, de un archivo. Ejemplo: $caracter = getc(INFILE);
#!/usr/local/bin/perl while (1) { $char = getc(STDIN); last if ($char eq "\*\"); $char =~ tr/a-zA-Z0-9/b-zaB-ZA1-90/; print ($char); } print ("\n");

binmode(manejador) Funcin que distingue entre archivos de texto y binarios. Normalmente en ambientes unix no hace falta distinguir entre estos tipos de archivos, pero en ambientes Microsoft si. binmode (DAT); syswrite(manejador,variable,largo) Funcin que graba sobre un archivo relativo el contenido una variable, de longitud especificada, sobre la posicin actual en la que se halle el puntero de archivo. syswrite(DAT, $buffer, 50); Script que aade un registro al final del archivo relativo catalg.rel
open(DAT,"+<catalg.rel"); seek(DAT,0,2); $ptro_archivo = tell(DAT); print "Se movio el puntero de archivo al final del archivo ($ptro_archivo)\n";

37

Universidad Nacional de Lujn - Gua del lenguaje Perl

$buffer="0442Disco Zip 1GB Iomega Japon 360130322.00"; syswrite(DAT, $buffer, 50); #Regraba el 3er registro # Lee e imprime el contenido del registro aadido seek(DAT,-50,2); read(DAT, $buffer, 50); &parsing_imprime(); close(DAT);

38

Universidad Nacional de Lujn - Gua del lenguaje Perl

Miscelaneas Utiles
"Fuera del perro, un libro es probablemente el mejor amigo del hombre, y dentro del perro,
probablemente, esta demasiado oscuro para leer". Groucho Marx

Leer parmetros de ejecucin de un programa El arreglo @ARGV almacena los argumentos de la lnea de comando. No incluye el nombre con el cual fue ejecutado el programa.
>perl leeparametros.pl 33 #!/usr/bin/perl foreach $parametro (@ARGV) { print "Parmetro: ".$parametro."\n" } 2parametro -123 "hola mundo"

Otras funciones rand(numero) Retorna un nmero al azar entre 0 y numero srand(nmero) Establece una semilla para rand time Retorna el tiempo en segundos desde el 1/1/1970. length(cadena) Retorna el largo en caracteres del string cadena
$a = "112244"; print length($a); # imprime 6

sleep(n) Hace que el programa tome una pausa durante n segundos chop(cadena) Elimina el ltimo caracter del valor de cadena
$cadena = "aabcdef"; chop($cadena) ; # $cadena almacena "aabcde";

index(expr1, expr2) Retorna la posicin de expr1 en expr2

39

Universidad Nacional de Lujn - Gua del lenguaje Perl

$a = "abcdef"; $b = index($a, "cd"); print $b; # imprime: 2

uc(cadena) Retorna los caracteres de cadena en mayusculas lc(cadena) Retorna los caracteres de cadena en minusculas substr($a, $pos, $len) extrae un subcadena de la cadena $a el 2do parmetro es la posicin inicial el 3er parmetro es la longitud de la subcadena a extraer
$a = "abcdef"; print substr ($a, 2, 3); # imprime: cde

Si la funcin substr se situa al lado izquierdo de una asignacin su efecto es de reemplazo de caracteres.
$a = "abcdef"; substr ( $a, 2, 3 ) = "xy"; print $a # cambia "cde" por "xy" # imprime: abxyf

grep(expresion, arreglo) Retorna un subarreglo que contiene los elementos del arreglo que satisfacen una determinada condicin.
@a = ("a1", "a2", "b1", "b2", "c1", "c2"); @b = grep /^b/, @a; print "@b"; # el patrn /^b/ indica elementos que comienzen # con b # imprime: b1 b2

sort(arreglo) Retorna un arreglo ordenado reverse(arreglo) Retorna un arreglo invertido Ejecucin de un programa Perl En la ejecucin de un programa Perl, alternativamente, se pueden utilizar modificadores switchs. Adicionalmente es posible colocarlos en la primer lnea de carga del interprete. (Ej. #!/usr/bin/perl w) perl -v # muestra la version del intprete Perl perl -V # muestra informacin acerca de la compilacin del intrprete.

40

Universidad Nacional de Lujn - Gua del lenguaje Perl

perl -w car.pl perl -e '....'

# muestra warnings antes de la ejecucin del programa car.pl # ejecuta las instrucciones entre comillas # perl -e '$a=78*3.14; print $a."\n"'

Trabajando con directorios Perl dispone de las funciones opendir, readdir y closedir, que permiten leer el contenido de un directorio. Readdir devuelve un arreglo con los nombres de todos los archivos. El siguiente programa busca en el directorio actual el nombre de un archivo determinado: Ejemplo:
#!/usr/local/bin/perl die "Uso: busca_en_directorio nombre_archivo\n" unless($ARGV[0]); # se chequea que exista el parmetro nombre de archivo opendir(MANEJADOR,".") || die "ERROR al leer el directorio actual\n"; foreach (readdir(MANEJADOR)){ print $_."\n"; print "\t\t\tSE HA HALLADO $_\n" if (/$ARGV[0]/io); } closedir MANEJADOR;

En la expresin regular io significa que la bsqueda ignora maysculas y minsculas, y que la expresin regular se compila slo una vez.

41

Universidad Nacional de Lujn - Gua del lenguaje Perl

Apndice: Ejemplo de instrucciones usuales para manejo de vectores de bits $cadena1 = "10101010"; $cadena2 = "11110000"; $vector1 = pack("b*", $cadena1); # $vector es un escalar que contiene a $vector2 = pack("b*", $cadena2); # cadena1 en formato binario #(vector de bits) $and = $vector1 & $vector2; $or = $vector1 | $vector2; # Se realiza un and (*) # Se realiza un or (+)

# Se mueven los escalares a un arreglo @resu1 = split(//,unpack("b*",$and)); # al arreglo resu1 se transfiere el @resu2 = split(//,unpack("b*", $or)); # vector de bits foreach $ele (@resu1) { print $ele }; print "\n"; # resultado del AND foreach $ele (@resu2) { print $ele }; print "\n\n"; # resultados del OR # Con la funcion vec es posible setear un bit vec($vector1,0,1) = 0; vec($vector2,7,1) = 1; # se setea a 0 el primer bit (a la izquierda) # se setea a 1 el ultimo bit de cadena2

@resu1 = split(//,unpack("b*",$vector1)); @resu2 = split(//,unpack("b*",$vector2)); foreach $ele (@resu1) { print $ele }; print "\n"; foreach $ele (@resu2) { print $ele }; print "\n\n"; # Con la funcion vec es posible testear el estado de un bit particular for($i=0;$i<=7;$i++) { $val1 = vec($vector1, $i, 1); # se testea el bit iesimo print $val1."\t" } print "\n"; # # # # # A los efectos de expandir una cadena que contiene un vector de bits simplemente se lo setea con vec. La expansion siempre se realiza de a byte. Ejemplo> Se tiene un cadena de 8 bits en 1, y con vec se setea el bit 10 a 1 [vec($cadena,9,1) = 1] entonces la cadena resultado sera: 1111111101000000

42

También podría gustarte