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:
|
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.