Subsecciones


Las Bases

Puesto que no todos los alumnos que están interesados en esta sección tienen conocimientos previos de Perl, en esta sección comenzamos haciendo un breve repaso a como construir un módulo en Perl y al mismo tiempo repasamos las características usadas del lenguaje. Si quieres tener un conocimiento mas profundo de como construir un módulo, lee el capítulo sobre módulos en [*] [10].

Version

El comportamiento de Perl puede variar ligeramente si la versión que tenemos instalada es antigua. Para ver la versión de Perl podemos hacer.

lhp@nereida:~/Lperl/src/topdown/PL0506$ perl -v

This is perl, v5.8.4 built for i386-linux-thread-multi

Copyright 1987-2004, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using `man perl' or `perldoc perl'.  If you have access to the
Internet, point your browser at http://www.perl.com/, the Perl Home Page.

h2xs

En primer lugar, construimos la estructura para nuestro proyecto de mini-lenguaje. La mejor forma de comenzar a escribir un módulo es usando la herramienta Perl h2xs. Supongamos que queremos construir un módulo PL::Tutu. Los nombres de los módulos siguen un esquema de identificadores separados por una pareja de :. Para saber más sobre el esquema de nombres de los módulos y la forma en la que estos se asigna a ficheros del sistema operativo, lea la sección sobre introducción a los módulos [*] [10].

lhp@nereida:~/Lperl/src/topdown/PL0506$ h2xs -XA -n PL::Tutu
Defaulting to backwards compatibility with perl 5.8.4
If you intend this module to be compatible with earlier perl versions, please
specify a minimum perl version with the -b option.

Writing PL-Tutu/lib/PL/Tutu.pm
Writing PL-Tutu/Makefile.PL
Writing PL-Tutu/README
Writing PL-Tutu/t/PL-Tutu.t
Writing PL-Tutu/Changes
Writing PL-Tutu/MANIFEST
La herramienta h2xs fué concebida para ayudar en la transformación de ficheros de cabecera de C en código Perl. La opción -X hace que se omita la creación de subrutinas externas (XS) La opción -A implica que el módulo no hará uso del AutoLoader. La opción -n proporciona el nombre del módulo. La llamada a h2xs crea la siguiente estructura de directorios y ficheros:
lhp@nereida:~/Lperl/src/topdown/PL0506$ tree
.
`-- PL-Tutu
    |-- Changes
    |-- MANIFEST
    |-- Makefile.PL
    |-- README
    |-- lib
    |   `-- PL
    |       `-- Tutu.pm
    `-- t
        `-- PL-Tutu.t

4 directories, 6 files

Generación del Makefile

Después de esto tenemos un módulo ''funcional'' que no hace nada. Lo podríamos instalar como si lo hubieramos descargado desde CPAN (Véase [*] [10]).

Después cambiamos al directorio PL-Tutu/ y hacemos perl Makefile.PL.

lhp@nereida:~/Lperl/src/topdown/PL0506$ cd PL-Tutu/
lhp@nereida:~/Lperl/src/topdown/PL0506/PL-Tutu$ perl Makefile.PL
Checking if your kit is complete...
Looks good
Writing Makefile for PL::Tutu
Esto crea el fichero Makefile necesario para actualizar nuestra aplicación. Para saber más sobre perl Makefile.PL lea [*] [10].

Documentación

Pasamos ahora a trabajar en el módulo. Primero escribimos la parte relativa a la documentación. Para ello editamos Tutu.pm:

lhp@nereida:~/Lperl/src/topdown/PL0506/PL-Tutu/lib/PL$ pwd
/home/lhp/Lperl/src/topdown/PL0506/PL-Tutu/lib/PL
lhp@nereida:~/Lperl/src/topdown/PL0506/PL-Tutu/lib/PL$ ls -l
total 4
-rw-r--r--  1 lhp lhp 2343 2005-09-28 11:16 Tutu.pm
y al final del mismo insertamos la documentación. Para saber más sobre el lenguajes de marcas de Perl (pod por plain old documentation) lea [*] [10]. En este caso escribimos:
1;
__END__

=head1 NOMBRE

PL::Tutu - Compilador para un lenguaje sencillo denominado
          "Tutu" que usaremos en la asignatura PL

=head1 SINOPSIS

  use PL::Tutu;
  
  La subrutina PL::Tutu::compiler recibe dos argumentos: el 
  nombre del fichero de entrada (fuente.tutu) y el nombre del fichero de
  salida (código ensamblador para una especie de P-máquina).

=head1 DESCRIPCIÓN

Este módulo tiene dos objetivos: aprender a hacer un pequeño compilador
y aprender a programar modularmente en Perl, usando un buen número
de los recursos que este lenguaje ofrece.

El siguiente es un ejemplo de código fuente tutu:
 
  int a,b; 
  string c;
  a = 2+3;
  b = 3*4; 
  c = "hola"; 
  p c; 
  c = "mundo"; 
  p c; 
  p 9+2; 
  p a+1; 
  p b+1

supuesto que está guardado en el fichero "test2.tutu", podemos 
escribir un programa Perl "main.pl" para compilarlo: 

    $ cat main.pl
    #!/usr/bin/perl -w -I..
    #use PL::Tutu;
    use Tutu;

    PL::Tutu::compiler(@ARGV);

al ejecutar "main.pl":

    $ ./main.pl test2.tutu test2.ok

obtenemos el fichero "test2.ok" con el ensamblador: 
    $ cat test2.ok
    DATA holamundo
    PUSH 5
    PUSHADDR 0
    STORE_INT
    PUSH 12
    PUSHADDR 1
    STORE_INT
    PUSHSTR 0 4
    PUSHADDR 2
    STORE_STRING
    LOAD_STRING 2
    PRINT_STR
    PUSHSTR 4 5
    PUSHADDR 2
    STORE_STRING
    LOAD_STRING 2
    PRINT_STR
    PUSH 11
    PRINT_INT
    LOAD 0
    INC
    PRINT_INT
    LOAD 1
    INC
    PRINT_INT

Para mas información consulta la página de la asignatura.
¡Buena suerte!

=head2 EXPORT

No se exporta nada al espacio de nombres del cliente.


=head1 AUTOR

Casiano Rodríguez León, E<lt>casiano@ull.esE<gt>

=head1 VÉASE TAMBIÉN

L<perl>.

=cut
La documentación puede ser mostrada utilizando el comando perldoc.

El resultado de usar perldoc Tutu


La forma en la que se controla la calidad de un módulo es mediante el desarrollo de pruebas. Las pruebas son programas perl que se sitúan en el directorio t/ y que tienen la extensión .t. Para ejecutar las pruebas se escribe:

make test

Vease la sección [*] [10] de los apuntes de LHP para ams detalles.


Repaso: Las Bases

Responda a las siguientes preguntas:

  1. ¿Cómo puedo saber con que versión de Perl estoy trabajando?
  2. Cuando el intérprete Perl encuentra una sentencia
    use Este::Modulo;
    
    ¿Donde busca el fichero Modulo.pm?
  3. ¿Con que opción debo usar Perl para ejecutar un programa en la línea de comandos?
  4. ¿Cómo se llama el programa que me permite crear el esqueleto para una distribución de un módulo? ¿Con que opciones debo llamarlo?
  5. Cuando se crea con h2xs el esqueleto para PL::Tutu: ¿En que subdirectorio queda el fichero conteniendo el esqueleto del módulo creado Tutu.pm?
  6. ¿Cuál es la función de MANIFEST?
  7. ¿Qué es Makefile.PL? ¿Cuál es su función? ¿Que significa la frase looks good?
  8. ¿Con que comando se crea el Makefile para trabajar en la plataforma actual?
  9. ¿Cómo se puede ver la documentación de un módulo?
  10. ¿Que hacen los siguientes comandos pod? Repase [*] [10] si tiene dudas.
    =head1 cabecera 
    =head2 cabecera 
    =item texto
    =over N
    =back
    =cut
    =pod
    =for X
    =begin X
    =end X
    
  11. ¿Que secuencia de comandos conocida como mantra de instalación es necesario ejecutar para instalar un módulo?
  12. ¿Cual es la función del directorio t?
  13. ¿Que tipo deben tener los programas de prueba para que make test los reconozca como pruebas?

Práctica: Crear y documentar el Módulo PL::Tutu

Reproduzca los pasos explicados en la sección 33.1 creando el módulo PL::Tutu y documentándolo.

Casiano Rodríguez León
2013-04-23