Un Programa Simple

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

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

La Documentación

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)


Para saber mas sobre el sistema de documentación Perl lea la sección 5.18.

Lectura

En la línea 4 (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.

Expresiones Regulares

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__/.

Definición 1.8.1   Casar significa que la cadena a la que se le hace el binding, 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__.

El constructo elsif

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; } 
}

Un Programa sin Variables

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.

Ejecución

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:

Ejercicio 1.8.1   Consideremos el siguiente programa:
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

0
Explique la salida. Conteste a las siguientes preguntas: Ayuda: recuerde que en Perl el retorno de carro que termina una línea leida queda almacenado en la variable ...



Subsecciones
Casiano Rodríguez León
2009-10-04