Usando la sabiduría colectiva

Cómo descargar módulos de Perl y como usar alguno de ellos. Algunas funciones útiles.

Escribir está bien. Hay dos o tres personas que incluso se ganan la vida con ello[1]. Pero hace falta hacer algo más. Copiar a Faulkner, por ejemplo. Pero no sólo copiarlo. Ser más Faulkner que Faulkner. O mezclar Faulkner con, pongamos por caso, David Sedaris. O quizás Hemingway con Sedaris. Y llegado a este punto, te voy a contar un secreto. No hace falta que programes absolutamente nada. Ya hay gente que ha hecho lo que tú piensas programar en este preciso instante. De hecho, un vietnamita y un chavalote de Mondoñedo que acaba de terminar un módulo de FP segundo grado. Pero ambos dos son buenas personas y legan su trabajo a la humanidad toda (inclusive tú). Si hay una sola cosa que haga al Perl superior a otros lenguajes de programación, son esas cosas que ha hecho la gente, empaquetado y colocado en un sitio común, llamado CPAN. CPAN significa, como probablemente ya habías adivinado, Comprehensive Perl Archive Network y es un sitio donde hay cienes, qué digo cienes, millardos de módulos que hacen todas esas cosas que se te hayan podido ocurrir y otras cuantas que, ni harto de vino, se te podrían haber ocurrido. Pero hay que saber usarlo, claro.

Nota

Si has tenido que pedirle a alguien que te instale el Perl, posiblemente sea el momento de que tengas a mano otra vez su teléfono o móvil, porque vas a volver a necesitarlo. No ahora. Más tarde. Mientras tanto, aunque no sea el día de apreciación del administrador del sistema, aprovecha para pensar en él con cariño. Antes de que la falta de calor humano lo convierta en un operador bastardo del infierno. Para instalar módulos de CPAN para que sean accesibles para todo el mundo hace falta tener privilegios de administrador; sin embargo, puedes instalarlos sin problemas en tu propio directorio (por ejemplo, en /home/miusuario/lib/perl).

En CPAN hay módulos para todo. En particular, para manejar textos en diferentes idiomas. Por ejemplo, un módulo para dividir en sílabas texto en castellano llamado Lingua::ES::Silabas. Todos los módulos en CPAN están organizados en espacios de nombres, para hacer más fácil su búsqueda y evitar colisiones de funcionalidad (y de nombre también). En este caso, el espacio de nombre es el Lingua, que incluye muchos más módulos cada vez más esotéricos. Pero este espacio está bien organizado, porque luego vienen un par de caracteres que indican a qué lengua se aplica el módulo susodicho; en este caso, ES. Finalmente, el último apartado es el realmente específico.

Nota

En cada sistema de ficheros específico, el nombre también indica en el directorio en el que estará almacenado, dentro de los directorios donde se suelen almacenar los módulos.

Un módulo es simplemente una biblioteca de utilidades para un fin determinado (o ninguno) escritas en Perl, o, al menos, empaquetadas para que se pueda acceder a ellas desde un programa en Perl. Una librería crea una serie de funciones a las que podemos acceder desde nuestros programas. Pero antes hay que instalarla. Y antes todavía, hay que ejecutar CPAN por primera vez:

jmerelo@vega:~$ sudo cpan
cpan shell -- CPAN exploration and modules installation (v1.83)
ReadLine support enabled

cpan> 
Si realmente es la primera vez que lo ejecutas, te preguntará una serie de cosas. En la mayoría es razonable contestar la opción que te ofrezcan por defecto, pero en un par de ellas si tienes que elegir:

Una vez configurado todo, ya se puede instalar el módulo susodicho. Lo puedes hacer directamente desde la línea de comandos con

install Lingua::ES::Silabas
CPAN: Storable loaded ok
LWP not available
Fetching with Net::FTP:
  ftp://ftp.rediris.es/mirror/CPAN/authors/01mailrc.txt.gz
Going to read /home/jmerelo/.cpan5.9.3/sources/authors/01mailrc.txt.gz
CPAN: Compress::Zlib loaded ok
LWP not available
[...más cosas...]
Fetching with Net::FTP:
  ftp://ftp.rediris.es/mirror/CPAN/authors/id/M/MA/MARCOS/CHECKSUMS

  CPAN: Module::Signature security checks disabled because Module::Signature
  not installed.  Please consider installing the Module::Signature module.  You may also need to be able to connect over the Internet to the public
  keyservers like pgp.mit.edu (port 11371).

Checksum for /home/jmerelo/.cpan5.9.3/sources/authors/id/M/MA/MARCOS/Lingua-ES-Silabas-0.01.tar.gz ok
Scanning cache /home/jmerelo/.cpan5.9.3/build for sizes
Lingua-ES-Silabas-0.01/
Lingua-ES-Silabas-0.01/Silabas.pm
Lingua-ES-Silabas-0.01/README
Lingua-ES-Silabas-0.01/Makefile.PL
Lingua-ES-Silabas-0.01/Changes
Lingua-ES-Silabas-0.01/MANIFEST
Lingua-ES-Silabas-0.01/test.pl

  CPAN.pm: Going to build M/MA/MARCOS/Lingua-ES-Silabas-0.01.tar.gz

Checking if your kit is complete...
Looks good
Writing Makefile for Lingua::ES::Silabas
cp Silabas.pm blib/lib/Lingua/ES/Silabas.pm
Manifying blib/man3/Lingua::ES::Silabas.3
  /usr/bin/make  -- OK
Running make test
PERL_DL_NONLAZY=1 /usr/local/bin/perl5.9.3 "-Iblib/lib" "-Iblib/arch" test.pl
1..9
# Running under perl version 5.009003 for linux
# Current time local: Mon Jul 10 23:34:36 2006
# Current time GMT:   Mon Jul 10 21:34:36 2006
# Using Test.pm version 1.25
ok 1
ok 2
ok 3
ok 4
ok 5
ok 6
ok 7
ok 8
ok 9
  /usr/bin/make test -- OK
Running make install
Installing /usr/local/lib/perl5/site_perl/5.9.3/Lingua/ES/Silabas.pm
Installing /usr/local/share/man/man3/Lingua::ES::Silabas.3
Writing /usr/local/lib/perl5/site_perl/5.9.3/i686-linux-thread-multi-ld/auto/Lingua/ES/Silabas/.packlist
Appending installation info to /usr/local/lib/perl5/5.9.3/i686-linux-thread-multi-ld/perllocal.pod
  sudo make install  -- OK
que, efectivamente, descarga el módulo del repositorio espejo de CPAN más cercano (en este caso ftp.rediris.es), lo "compila", hace una serie de tests (sin los cuales no se instalaría siquiera) y efectivamente lo instala para que esté disponible para todos los programas que quieran usarlo (que no creo que sean muchos, pero alguno puede caer).

Pero, ¿andestá la documentación? se preguntará el preocupado (aunque apresurado) lector. No preocuparse. Todo módulo en CPAN está documentado y se accede a él usando el mismo sistema que se usa para todo Perl: el programa perldoc. En este caso, perldoc Lingua::ES::Silabas nos devolverá algo así:

Lingua::ES::Silabas(3)User Contributed Perl DocumentatioLingua::ES::Silabas(3)



NOMBRE
       Lingua::ES::Silabas - Divide una palabra en silabas

SINOPSIS
         use Lingua::ES::Silabas;

         $palabra = âexternocleidomastoideoâ; # muchas silabas ;-)

         ## en contexto de lista,
         ## lista de silabas que componen la palabra
         @silabas = silabas($palabra);

         ## en contexto escalar,
         ## el numero de silabas que componen la palabra
         $num_silabas = silabas($palabra);

Todos los módulos en CPAN están documentados con un pequeño manual de referencia y ejemplos; es conveniente tener este manual abierto cuando se programe, o usar directamente los ejemplos incluidos en la SINOPSIS para comenzar a programar con él.

Vamos a ver ahora como se usa ese pozo de sabiduría para bajarnos una página web

use LWP::Simple;                                                         (1)

getprint('http://localhost:8020/');                                              (2)
(1)
En esta línea lo único que se hace es cargar la librería que tendrá que estar instalada; no es el caso con esta, porque forma parte del núcleo o core. Cargar implica incorporar las funciones que ese módulo exporte; para saber qué funciones son esas habrá que consultar la página de manual, claro.

Si te das cuenta, no ha habido que especificar dónde diablos se busca ese módulo para incorporarlo al programa. Mágicamente, el intérprete de Perl busca que te busca en todos los directorios razonables, hasta que lo encuentra. Pero aunque mágico, no es telepático y no sabe donde tú, precisamente, has podido instalar ese módulo. Especialmente si no tienes privilegios de superusuario y has tenido que instalarlo en tu ${HOME}, tendrás que especificarle en qué directorio buscar, de esta forma:

use lib "/home/esesoyyo/lib/perl";  
use LWP::Simple;
Es decir, antes de tratar de cargar el módulo.

(2)
Sin dar muchas más vueltas, aquí está la orden que se baja la página web y la imprime. getprint es precisamente una de esas funciones que el módulo ha importado.

Por otra parte, hay una forma más simple de hacer lo mismo, directamente desde la línea de comandos

 perl -MLWP::Simple -e 'getprint("http://localhost:8020")'
La opción -M carga el módulo que la sigue, y -e ejecuta el código Perl que le sigue. Es conveniente para programas cortos, o si se quiere hacer un alias del shell, por ejemplo.[2]

Importante

Ejercicios. Hay gigas y gigas de módulos, a cada cuál más útil y sorprendente. Los módulos Acme::, por ejemplo, son absolutamente inútiles y no tienen equivalente en ningún otro lenguaje. Instalar el módulo Acme::Clouseau por ejemplo y ejecutar el programa de prueba que se incluye en su Sinopsis.

Notas

[1]

Los monjes trapenses de la congregación periférica de E/S ya no, desgraciadamente y se dedican a la elaboración de un delicioso licor de alcachofa

[2]

En cuanto que yo averigüe cómo diablos se hace, lo comunicaré oportunamente.