lhp@nereida:~/Lperl/src$ cat -n example1.pl 1 #!/usr/bin/perl -w 2 use strict; 3 4 while (defined($_ = <STDIN>)) { 5 if (/__END__/) { last; } 6 elsif (/LHP/) { print; } 7 } 8 9 =head1 NAME example1.pl 10 11 =head1 SYNOPSIS 12 13 example1.pl < file 14 15 =head1 DESCRIPTION 16 17 Reads file C<file> and prints all the lines containing 18 the string C<LHP> up to a line containing 19 the string C<__END__>. For example given the input file: 20 21 lhp@nereida:~/Lperl/src$ cat -n example1.input 22 1 Esta linea no se imprime 23 2 Esta linea si se imprime LHP 24 3 Esta no 25 4 Esta LHP si 26 5 __END__ 27 6 y se acabo LHP 28 7 esta linea tampoco sale 29 30 the program produces the following output: 31 32 lhp@nereida:~/Lperl/src$ example1.pl < example1.input 33 Esta linea si se imprime LHP 34 Esta LHP si
Las líneas de la 9 a la 34 documentan el uso del programa
mediante un lenguaje de marcas denominado pod.
Podemos ver la documentación con perldoc
:
lhp@nereida:~/Lperl/src$ perldoc example1.pl
EXAMPLE1(1) User Contributed Perl Documentation EXAMPLE1(1) NAME example1.pl SYNOPSIS example1.pl < file DESCRIPTION Reads file "file" and prints all the lines containing the string "LHP" up to a line containing the string "__END__". For example given the input file: lhp@nereida:~/Lperl/src$ cat -n example1.input 1 Esta linea no se imprime 2 Esta linea si se imprime LHP 3 Esta no 4 Esta LHP si 5 __END__ 6 y se acabo LHP 7 esta linea tampoco sale the program produces the following output: lhp@nereida:~/Lperl/src$ example1.pl < example1.input Esta linea si se imprime LHP Esta LHP si perl v5.8.8 2007-02-23 EXAMPLE1(1) |
while (defined($_ = <STDIN>)
)
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.
Una expresión entre barras como /__END__/
(línea 2)
o /LHP/
(línea 3) es una expresión regular en Perl.
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__/
.
$_
, 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__
.
El constructo elsif nos permite
abreviar un else
seguido de un if
.
Asi escribimos:
if (/__END__/) { last } elsif (/LHP/) { print }en vez de:
if (/__END__/) { last; } else { if (/LHP/) { print; } }
Este es un ejemplo típico de programa Perl ''moderadamente críptico'':
no aparece explícitamente ninguna variable salvo por la referencia a $_
en la
línea 4.
Sigue un ejemplo de ejecución:
lhp@nereida:~/Lperl/src$ cat -n example1.input 1 Esta linea no se imprime 2 Esta linea si se imprime LHP 3 Esta no 4 Esta LHP si 5 __END__ 6 y se acabo LHP 7 esta linea tampoco sale 8 lhp@nereida:~/Lperl/src$ cat example1.input | example1.pl Esta linea si se imprime LHP Esta LHP si
Antes de seguir, responda a las siguientes preguntas:
lhp@nereida:~/Lperl/src$ cat -n muerte_prematura4.pl 1 #!/usr/local/bin/perl -w 2 use strict; 3 print while <STDIN>;Véase un ejemplo de ejecución:
lhp@nereida:~/Lperl/src$ cat -E mp4.in2 0$ $ 0$ lhp@nereida:~/Lperl/src$ cat mp4.in2 | muerte_prematura4.pl 0 0Explique la salida. Conteste a las siguientes preguntas:
0
: ¿Se terminará el bucle?
0
?