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?