next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Práctica: Radio de una Sup: Introducción Ant: Depuración de errores Err: Si hallas una errata ...


Una Breve Introducción a las Expresiones Regulares

El siguiente programa combina algunas de las características introducidas en las secciones anteriores, además de hacer uso de las expresiones regulares.

 1 while (<STDIN>) {
 2  if (/__END__/) { last; }
 3  elsif (/LHP/) { print; }
 4 }

En la línea 1 almacenamos en la variable mágica $_ una línea que es leída desde la entrada estándar. El bucle se ejecuta mientras la condición sea cierta: mientras haya líneas en el fichero. Cuando se alcanza el final del fichero, se devuelve undef y por tanto se termina el bucle.

Antes de seguir, responda a las siguientes preguntas:

Ejercicio 1.5.1   Ayuda: recuerde que en Perl el retorno de carro que termina una línea leida queda almacenado en la variable ...

Una expresión entre barras como /__END__/ (línea 2) o /LHP/ (línea 3) es una expresión regular en Perl.

Las Expresiones Regulares se pueden encontrar en muchos editores como vi, emacs, en programas como grep, egrep y en lenguajes de programación como awk y sed. Las Expresiones Regulares se usan para busquedas avanzadas dependientes del contexto. Las Expresiones Regulares describen de manera unívoca un lenguaje. La figura 1.2 muestra algunos de los metasímbolos usados en las expresiones regulares. Por ejemplo, la expresión regular /[a-z]+/ define el lenguaje formado por las cadenas que consisten en repeticiones de una o mas letras minúsculas.


Tabla 1.2: Algunos metasímbolos usados en las expresiones regulares
* El elemento precedente debe aparecer 0 o más veces.
+ El elemento precedente debe aparecer 1 o más veces.
. Un carácter cualquiera excepto salto de linea.
? Operador unario. El elemento precedente es opcional
{n} que coincida exactamente n veces
{n,} que coincida al menos n veces
{n,m} que coincida al menos n veces y no mas de m
| O uno u otro.
^ Comienzo de linea
$ Fin de linea
. Cualquier carácter que no sea el retorno de carro
[...] Conjunto de caracteres admitidos.
[^...] Conjunto de caracteres no admitidos.
- Operador de rango
(...) Agrupación.
\ Escape
\n Representación del carácter fin de linea.
\t Representación del carácter de tabulación.




Para saber más sobre expresiones regulares, estudie el capítulo 4. Por ahora nos basta saber que una expresión regular define un lenguaje. Asi la expresión regular /__END__/ define el lenguaje cuya única palabra es __END__ y la expresión regular /LHP/ define el lenguaje cuya única palabra es LHP.

Normalmente, con las expresiones regulares se usa El operador de binding =~, el cuál nos permite ``asociar'' la variable con la operación de casamiento:

if ($d =~ /esto/) { print "la palabra 'esto' aparece en: $d\n" }
Si se omiten el operador =~ y la variable, como se hace en la línea 2 entonces se usa la variable por defecto $_.

A menudo resulta práctico extraer las palabras que contienen una cifra, una vocal, o caracteres de control particulares. El modelo así definido no se indica por un carácter particular sino por un clase de caracteres mediante el operador [ ]. He aquí algunas posibles construcciones:

        [aeiou]        # Cualquier vocal
        [0-9]          # Cualquier número del 0 al 9.
        [0123456789]   # Igual [0-9]
        [0-9a-z]       # Cualquier letra o cualquier numéro
        [\~\@;:\^_]    # Cualquiera de los caracteres(~,@,;,:^,_)

Generalmente de puede definir una clase de caracteres valiéndose de la complementaria. Ésta se especifíca mediante la sintaxis [^ ]. Siendo el símbolo ^ el que representa la negación de los caracteres o clase de caracteres consecutivos:

        [^0-9]         # Carácter que no sea un dígito

Perl introduce algunas abreviaturas usadas para algunas de las clases mas comunes:


Tabla 1.3: Abreviaturas para clases expreg
Código Significado
\d [0-9] dígitos del 0 al 9
\D [^0-9] carácter que no sea un dígito
\w [a-zA-Z0-9_] carácter alfanumérico
\W [^a-zA-Z0-9_] carácter no alfanumérico
\s [ \t\n\r\f] espacio en blanco
\S [^ \t\n\r\f] carácter que no es un espacio en blanco


La condición if (/__END__/) ... en la línea 2 es cierta si la variable por defecto $_ ``casa'' con la expresión regular /__END__/ o, lo que es lo mismo, pertenece al lenguaje descrito por la expresión regular /__END__/. Casar en Perl significa que la cadena en cuestión, en este caso $_, contiene en algúna posición una subcadena que pertenece al lenguaje descrito por la expresión regular. Si se quisiera que solo hubiera casamiento cuando $_ sea exactamente __END__ deberíamos usar anclas. Un ancla es un metasímbolo que casa con una posición. Por ejemplo, el circunflejo ^ es un metasímbolo que casa con el comienzo de la cadena y el dolar $ casa con el final. Así pues, si la expresión regular fuera /^__END__$/ estaríamos forzando a que casar sea equivalente a que la cadena sea exactamente igual a __END__.

Obsérvese como también la entrada <STDIN> desde STDIN no es asignada explícitamente a una variable y por tanto la línea leída es guardada en la variable por defecto $_. El constructo elsif nos permite abreviar un else seguido de un if.

Este es un ejemplo típico de programa Perl ``moderadamente críptico'': no aparece explícitamente ninguna variable en el texto del programa.


next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Práctica: Radio de una Sup: Introducción Ant: Depuración de errores Err: Si hallas una errata ...
Casiano Rodríguez León
2006-02-21