HTMLpointHTMLpoint HTMLpoint.com


 Utilizar los módulos



Empecemos antes de nada por la pregunta que alguien podría hacerse: ¿qué son los módulos?

Un módulo es un conjunto de operaciones que pueden ser utilizadas en cualquier script en Perl simplemente llamando al módulo al que se hace referencia y las operaciones que de él nos interesa utilizar. Es evidente que dentro de un script se pueden llamar diversos módulos según lo que efectivamente le sirva
a quien está programando; además, algunos módulos dependen, a su vez, de otros módulos: si, por ejemplo, se quiere utilizar el módulo "A" que necesita el módulo "B", será necesario llamar dentro del script sólo al módulo "A" con la seguridad de que él mismo irá a buscar y usar el módulo "B".

A los módulos, dentro de los script, se les llama simplemente con una línea parecida a :

use Modulo;
equivalente a la escritura:
BEGIN {
        require "Módulo.pm"; # indica al intérprete la necesidad de precargar el módulo
        Modulo->import();     # importa la lista completa de símbolos contenidos en el módulo
}
Pero ¿qué significa verdaderamente utilizar un módulo?
Si vamos a leer el código de cualquier módulo, es posible que esté presente una lista con el nombre @EXPORT: por tanto, utilizar el módulo significa utilizar los símbolos que contiene, precargando la lista completa (en el caso de que se utilice "use Modulo;") o sólo los que nos interesan (empleando "use Modulo LIST", donde LIST es la lista de los símbolos que nos interesa usar) en fase de compilación del script.

Normalmente, los módulos tienen un nombre que termina con ".pm" (English.pm, Apache.pm, etc., que sea como sea se omite en el caso de que se utilice "use Modulo", como hemos visto antes), por lo cual se pueden localizar fácilmente dentro del directorio "lib" o equivalente del Perl (podría ser  /usr/lib/perl5). En este directorio, además, están presentes otros directorios: Apache, CGI, DBI, WWW, Text, etc. Los módulos presentes en estos directorios están unidos todos al argumento deducibile del nombre del directorio: por ejemplo, en el directorio CGI están presentes todos los módulos que tienen que ver con los CGI (procesan los datos del form etc.), en el directorio Apache todos los relacionados con Apache, etc. Tomemos, por ejemplo, el módulo Form.pm qaue está en el directorio CGI: a éste se le llamará comunmente CGI::Form para indiciar que está en el directorio CGI y que, por lo tanto, tiene que ver con los CGI.

Además, para muchos módulos está presente la documentación (POD) incluida directamente en el código del módulo en la forma:
 

=head1 NAME

Modulo.pm - Sirve para hacer...

=head1 ABSTRACT

Con este módulo se puede hacer...

=head1 INSTALLATION:

Este módulo se instala.....


Este formato de documentación (que el intérprete ignora en la lectura del módulo, si se le ha llamado dentro de un script) resulta agotadoramente ilegible: para leerlo cómodamente se necesitará el comando

perldoc nombre_módulo.pm
que formateará la documentación mostrándola como siempre ocurre con las páginas de manual, ¡haciéndola humanamente legible! El resultado será muy parecido a:
 
Módulo.pm(3pm)   User Contributed Perl Documentation   Módulo.pm(3pm)
 

NAME
                  Módulo.pm  - Sirve para hacer... etc., etc., etc., etc., etc., etc., etc., etc.
                  etc., etc., etc., etc. ....

ABSTRACT
                  Con este módulo se puede hacer...

INSTALLATION:
                  Este módulo se instala .....


¡Sin duda, mucho más cómoda de leer, además de paginada como se debe!
 

Tomemos ahora un módulo completo y veamos algún ejemplo práctico sobre como se puede operar con esto.

Antes de nada, veamos la documentación: usaremos aquí el módulo "English.pm", que utiliza los nombres ingleses para las variables de puntuación (por ejemplo, $! se convierte en $OS_ERROR, $< en $REAL_USER_ID, etc.), bastante concisa pero útil para nuestros fines.

Leyendo el file, la documentación es (para no extendernos demasiado e inútilmente hemos cortado algunas partes).

 
=head1 NAME

English - use nice English (or awk) names for ugly punctuation variables

=head1 SYNOPSIS

    use English;
    ...
    if ($ERRNO =~ /denied/) { ... }

=head1 DESCRIPTION

This module provides aliases for the built-in variables whose
names no one seems to like to read.  Variables with side-effects
which get triggered just by accessing them (like $0) will still
be affected.


Leída con perldoc English.pm resulta lo siguiente:

NAME
       English - use nice English (or awk) names for ugly
       punctuation variables

SYNOPSIS
           use English;
           ...
           if ($ERRNO =~ /denied/) { ... }
 

DESCRIPTION
       This module provides aliases for the built-in variables
       whose names no one seems to like to read.  Variables with
       side-effects which get triggered just by accessing them
       (like $0) will still be affected.


No creo que sirva añadir nada más, salvo que con el comando "pod2man" podréis transformar la documentación en el formato clásico de las páginas de manual, llevándolo todo a un file que se podrá leer con "man -l nomefile". Un ejemplo rápido:

pod2man Modulo.pm > file
per crear el file;

man -l file
para leerlo gracias al comando "man"


Ahora veamos brevemente cómo utilizar los módulos dentro de los script: usaremos aquí un módulo que me gusta mucho, es decir "perlmenu.pm", que permite crear cómodos menús para los script. Usad este código como ejemplo:

#!/usr/bin/perl

$| = 1;

BEGIN { $Curses::OldCurses = 1; }
use Curses;
use perlmenú;

&menú_init(1, " Elige: ");
&menú_item("Primera opción", "1");
&menú_item("Segunda opción", "-b");
$sel=&menu_display_mult("$ppppp");
if ($sel eq '1') {
    # Haz una determinada cosa
} elsif ($sel eq '2') {
    # Haz otra cosa
} else {exit}

Intentemos subrayar las particularidades sin detenernos en los requerimientos específicos del módulo en cuestión, como "$|=1" o "BEGIN { $Curses::OldCurses = 1; }" o incluso "use Curses" (requerimientos del módulo para algunas de sus funciones).
La línea donde se requiere el módulo "perlmenu.pm" es la cuarta: simplemente, hemos usado la sintaxis "use Modulo", donde en Modulo hemos sustituido el nombre "perlmenu".
Empezando después por las subroutines: ¿pero dónde se han definido? Leed el código del módulo en la línea 343 (aproximadamente) donde se explicará qué es menu_init y, un poco más abajo, será posible ver el código de la suboutine en la forma:
sub menu_init { ... }
y entender a fondo su función; en dos palabras, esta sub no hace sino darle vida a un menú utilizando las bibliotecas Curses.
Lo mismo le sucede a &menu_item, sólo que esta subroutine sirve para incluir los elementos en el menú.
El resto del código es un simple bloque if/else e l'output del script aparecerá en el terminal:
 
 Elige: 

       1) (Done with selections)
->   2) [X] Primera opción
       3) [  ] Segunda opción
 
 
 
 (All)   h)elp q)uit u)p a)ll m)atch c)lear b)egin e)nd r)efresh


Lo que más nos interesa, de todas formas, no es el layout del script resultante, cómo volver a invocar un módulo y cómo se pueden utilizar los símbolos, las operaciones y las funciones que éste contiene.

Para saber utilizar correctamente un módulo es necesario leer atentamente la documentacion en su conjunto: si a alguien le puede parecer una pérdida de tiempo banal, sobre todo para los módulos "simples", subrayamos aquí que valdrá la pena a fin de reducir el tiempo necesario para la escritura de vuestro código con la seguridad de emplear funciones y operaciones ya testadas por personas preparadas y, por lo tanto, fiables desde todos los puntos de vista; ¿por qué, entonces, perder el tiempo escribiendo funciones que ya existen en determinados módulos y pueden resultar más seguras o, por lo menos, más útiles de las que nosotros podemos escribir?
 

Una última cosa antes de terminar: entre tanto, si usáis un módulo dentro de un script, es obvio que también las otras personas que utilicen el script necesitarán el mismo módulo para la correcta ejecución del script: de otro modo el intérprete Perl mostrará un mensaje de error parecido a:

Can't locate Modulo.pm in @INC (@INC contains: /usr/lib/perl5/i386-linux/5.004 /usr/lib/perl5 /usr/local/lib/site_perl/i386-linux /usr/local/lib/site_perl .) at prova.pl line 2.
BEGIN failed--compilation aborted at prova.pl line 2.
Por eso, si vuestro script emplea módulos y va a ser utilizado por terceros, que no se os olvide recordarles que tienen que conseguir el módulo en cuestión o nunca conseguirán ejecutar el script.


[ Índice ]
  Torna a inizio pagina