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:
0
: ¿Se terminará el bucle?
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.
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:
|
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.