TUTORIAL PERL Sabino Miranda Jiménez [email protected] Resumen • Introducción a Perl • Definición de variables • Estructuras de control • Estructuras para el manejo de datos • Arreglos • Hash • Expresiones regulares • Manejo de archivos Acerca de Perl • Diseñado por Larry Wall en 1987 • Toma características de • • • • • • C Bourne shell (sh) AWK Sed Lisp otros lenguajes de programación, en menor grado. • Lenguaje interpretado • Versión 5 soporta • Estructuras de datos complejas • Funciones de primer orden • Programación orientada a objetos • Uso de módulos Definición de variables • Una variable es un lugar donde se guarda información Tipo Carácter Ejemplo Descripción Escalar $ $nombre Valor individual Arreglo @ @edades Lista de valores, indexado por un número Hash % %nomEdades Grupo de valores, indexado por una cadena (clave-valor) Subrutina & &rutina Código de Perl que se puede invocar Typeglob * *tipo Representa a cualquier tipo anterior Escalares Definición de variables se usa el símbolo ($) $entidad = "casas"; $modificador = 'rojo'; $i = 10; print $entidad; imprime "casas" Para concatenar cadenas operador punto (.) print $i . " " . $entidad imprime "10 casas" Arreglos Un arreglo se define listando sus elementos separados por comas y entre paréntesis. Se define por el símbolo (@) @frecuencia = (10, 33, 44, 16); Para acceder a los elementos se usa un índice, generalmente inicia en cero, $frecuencia[2] #elemento 44 #obtiene el número de elementos del arreglo frecuencia $numero = @frecuencia; # numero obtiene 4 Hashes Un hash es un arreglo asociativo (clave, valor). Se define por el símbolo (%) %ejem_hash = ( casa => 6233, rojo => 511, comer => 322, ir => 2333, ); Operadores aritméticos Operación Operador Ejemplo Suma + $val = 5 + 7 Resta - $val = 15 – 5 Producto * $val = 15 * 2 División / $val = 10 / 5 Módulo % $val = 9 % 2 $val 1 Exponenciación ** $val = 3**2 $val 9 Operadores relacionales Operador Descripción == Igualdad != Desigualdad < Menor que <= Menor o igual que > Mayor que >= Mayor o igual que Operadores lógicos Operador Descripción and && Conjunción or || Disyunción not ! Negación Operadores para cadenas Operador Descripción eq Igualdad ne Desigualdad lt Menor que le Menor o igual que gt Mayor que ge Mayor o igual que Funciones básicas Función Descripción Ejemplo abs($x) Obtiene el valor absoluto $val = abs(-10); $val 10 int($x) Obtiene la parte entera $val = int(8.5); $val 8 sqrt($x) Obtiene la raíz cuadrada $x>=0 $val = sqrt(25); $val 5 rand() Obtiene un valor entre 0 y 1 $val = rand(); chomp($x) Remueve, generalmente, un salto de línea del final de la línea $x =’10\n’; chomp($x); $val ‘10’ split(expreg,datos) Devuelve un arreglo con los elementos obtenidos de datos según la expresión regular indicada @dat = split(/\s+/, "el perro del panadero"); Estructuras condicionales If ( expresión_condicional) { …. # acciones cuando es verdadera la condición } else { …. # acciones cuando es falsa la condición } Estructuras condicionales (2) If ( expresión_condicional1) { …. # acciones cuando es verdadera la condición1 } elsif (expresión_condicional2) { …. # acciones cuando es verdadera la condición2 } else { …. # acciones cuando es falsa la condición1 y 2 } Ejemplo: lectura de tres números, identifica al mayor $x = <>; $y = <>; $z = <>; chomp($x); chomp($y); chomp($z); if ($x>=$y){ if ($x>=$z){ print "el número mayor es $x"; }else { print "el número mayor es $z"; } }elsif($y>=$z){ print "el número mayor es $y"; }else{ print "el número mayor es $z"; } Estructuras iterativas • while • for • foreach last similar a break (Java) ; next similar a continue (Java); Estructuras iterativas (2) while ( expresión_condicional) { …. # acciones mientras sea verdadera la condición } for( acciones_ini ; condición ; acciones_x_iteración) { …. # acciones mientras sea verdadera la condición } Estructuras iterativas (3) foreach $x ( grupo_datos) { …. # acciones para cada elemento del grupo } Ejemplo: primeros 10 números $x = 1; while ($x<=10) { print "$x\n"; $x++; } Ejemplo: primeros 10 números $x = 1; while ($x<=10) { print "$x\n"; $x++; } for ($x=1;$x<=10;$x++) { print "$x\n"; } Ejemplo: primeros 10 números $x = 1; while ($x<=10) { print "$x\n"; $x++; } for ($x=1;$x<=10;$x++) { print "$x\n"; } foreach $x (1,2,3,4,5,6,7,8,9,10) { print "$x\n"; } Uso de next & last for($x = 0 ; $x < 100 ; $x++) { if($x == 74) { last; # Fuera de Ciclo } if($x % 9 != 0){ next; # Siguiente Iteración } print "$x\n"; } Manipulación de cadenas • Operadores sustitución de secuencia de caracteres tr/patrón/sustitución/ cambia caracteres individuales m/patrón/ igualamiento de caracteres s/patrón/sustitución/ Operadores de vinculación =~ vincula una expresión de cadena con el patrón de igualamiento $_ : variable por defecto !~ similar a =~ pero lógicamente negado cadena =~ m/patrón/ Manipulación de cadenas Opciones operador ‘s’ Sólo reemplaza la primera ocurrencia del patrón buscado g: reemplaza cada aparición del patrón i : ignora entre mayúsculas y minúsculas m : la cadena que se evaluará es de varias líneas s/patrón/sustitución/gi Manipulación de cadenas tr/conj1/conj2/ Traduce el primer conjunto de caracteres en el segundo conjunto. • Si el segundo conjunto es más pequeño, el último carácter se multiplica • Si el segundo conjunto es más grande, los caracteres adicionales se truncan Opciones operador ‘tr’ c : reemplaza el complemento de la clase de búsqueda d : borra los caracteres de la clase de búsqueda que no son reemplazados s : reduce la secuencia de caracteres idénticos a uno solo Ejemplos # reemplaza la primer ocurrencia de "el" $text = "De los cerros altos del sur, el de Luvina es el más alto y el más pedregoso."; $text =~ s/el/EL/; print "ej1: $text\n\n"; # reemplaza todas las ocurrencias de "el" $text =~ s/el/EL/g; print "ej2: $text\n\n"; # convierte a minúsculas $text =~ tr/[A-Z]/[a-z]/; print "ej3: $text\n\n"; Ejemplos (2) # borra las vocales $text =~ tr/AEIOUaeiou//d; print "ej4: $text\n\n"; # reemplaza secuencias no numéricas con x $text = "2aber2333222"; $text =~ tr/[0-9]/x/cs; print "ej5: $text\n\n"; Ejemplos (3) # reemplaza todas las letra mayúsculas por MAYUS $text = "De los cerros altos del sur, el de Luvina es el más alto y el más pedregoso."; $text =~ s/[A-Z]/MAYUS/g; print "ej6: $text\n\n"; if($text =~ m/Luvina/){ print "Se encontró la palabra: Luvina\n"; } Expresiones Regulares Define un patrón que se buscará sobre alguna cadena. Meta-símbolo Descripción \b Indica límite de la palabra \B Fin de no palabra \d Cualquier dígito (0-9) \D Cualquier no dígito \s Espacio en blanco \S Cualquier no espacio \t Cualquier tabulador \r Retorno de carro \n Salto de línea \w Cualquier palabra, incluye ‘_’ \W Cualquier no palabra Expresiones Regulares (2) Meta-símbolo Descripción . Cualquier carácter, (excepto \n) * 0 o más veces el patrón + 1 o más veces el patrón ? 0 o 1 vez el patrón {MIN,MAX} Debe ocurrir al menos MIN veces pero no más de MAX veces {MIN,} Debe ocurrir al menos MIN veces {N} Debe ocurrir exactamente N veces * Agregar el operador ? para que el patrón no sea voraz y se obtenga el mínimo +? Expresiones Regulares (3) Posición ^ Descripción 1. Indica inicio de la cadena 2. Negación dentro de una clase de caracteres $ Indica fin de la cadena Generales: | : alternativas entre varias m/el|los|las/ ( ) : agrupamiento se hace referencia al grupo por medio de $1, $2, ..$9 [ ] : clase de caracteres m/(el|un) perro/ m/[A-Z]/ m/[^aeio]/ *no contenga a,e,i,o Ejemplo # Elimina espacios al inicio de la línea $text = " El perro comió la torta"; $text =~ s/ ^\s+//g; "El perro comió la torta" # encuentra las posiciones del artículo ‘el’ dentro del texto $text = "De los cerros altos del sur, el de Luvina es el más alto y el más pedregoso."; while($text =~ m/\bel\b/gi){ printf " 'el' en pos: %d\n" , pos($text)-1; } Ejemplo2 # Identifica los artículos indefinidos de un texto while($linea = <>){ if ($linea =~ m/\bun(o|a)?\b|\bun[oa]s\b/){ print "contiene art. indef.[un, uno, unos, unas]"; } } Ejemplo con agrupaciones print "Invierte el par de palabras capturadas\n"; while($linea = <>){ if ($linea =~ m/^((\w+) (\w+))$/){ print "$3- $2"; # grupo1 = $1 } } Ejercicios • Imprimir todas las líneas que empiecen con una palabra en mayúsculas • Imprimir todas las líneas que empiecen con algún artículo