Creative Commons License
Excepto donde se indique otra cosa, todo el contenido de este lugar está bajo una licencia de Creative Commons.
Taquiones > perl > pmtools

pmtools

El paquete pmtools (y su versión en Debian pmtools) proporciona un juego de herramientas (para usar en consola) útiles en desarrollo de programas Perl.

Consiste en un juego de scripts de pequeño tamaño y funcionalidad muy concreta, que siguen la filosofía de mantenlo pequeño que tan buenos frutos da en muchos escenarios.

Dado que resuelven un buen número de problemas con los que puede encontrarse un desarrollador Perl a lo largo del día, también resulta muy beneficioso estudiar su diseño y código (por lo demás más simple que una sandalia).

Rutas físicas

pmdirs - qué contiene @INC

Muestra el contenido actual de la lista @INC:

$ pmdirs 
/etc/perl
/usr/local/lib/perl/5.8.8
/usr/local/share/perl/5.8.8
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.8
/usr/share/perl/5.8
/usr/local/lib/site_perl
/usr/local/lib/perl/5.8.7
/usr/local/share/perl/5.8.7
.
$

pods - todos los archivos POD

Obtiene todas las rutas de todos los archivos POD del sistema.

$ pods 
/usr/share/perl/5.8/pod/perl5005delta.pod
/usr/share/perl/5.8/pod/perl56delta.pod
/usr/share/perl/5.8/pod/perl570delta.pod
/usr/share/perl/5.8/pod/perl571delta.pod
/usr/share/perl/5.8/pod/perl572delta.pod
...
$

stdpods - todos los POD fuera de site_perl

Obtiene las rutas físicas de los módulos POD que no están en los directorios site_perl, utilizando para ello a basepods y a modpods.

$ stdpods 
/usr/share/perl/5.8/pod/perl561delta.pod
/usr/share/perl/5.8/pod/a2p.pod
/usr/share/perl/5.8/pod/perl.pod
/usr/share/perl/5.8/pod/perl5004delta.pod
...
/usr/local/share/perl/5.8.7/IO/Zlib.pm
/usr/local/share/perl/5.8.7/Parse/CPAN/Packages.pm
/usr/local/share/perl/5.8.7/Parse/CPAN/Packages/Distribution.pm
/usr/local/share/perl/5.8.7/Parse/CPAN/Packages/Package.pm
/usr/local/share/perl/5.8.7/Sort/Versions.pm
$

sitepods - todos los POD dentro de site_perl

Usando modpods obtiene las rutas de los módulos dentro de site_perl.

basepods - los archivos POD de la instalación base

Recupera las rutas físicas de los archivos POD en la instalación estándar del sistema. Utiliza la variable de configuración Perl $Config{installprivlib}, subdirectorio pod, como punto de partida para buscar archivos.

$ basepods 
/usr/share/perl/5.8/pod/perl561delta.pod
/usr/share/perl/5.8/pod/a2p.pod
/usr/share/perl/5.8/pod/perl.pod
/usr/share/perl/5.8/pod/perl5004delta.pod
/usr/share/perl/5.8/pod/perl5005delta.pod
/usr/share/perl/5.8/pod/perl56delta.pod
...

modpods - todos los archivos de los módulos

Obtiene la ruta física de todos los módulos instalados en el sistema. Se incluyen los módulos estandar (los que se obtienen mediante stdpods) y los locales (los que se obtienen de sitepods).

En realidad es un frontal para el programa pminst -l.

$ modpods
/etc/perl/CPAN/Config.pm
/usr/lib/perl5/AptPkg.pm
/usr/lib/perl5/APR.pm
/usr/lib/perl5/Curses.pm
/usr/lib/perl5/Cairo.pm
/usr/lib/perl5/Clone.pm
/usr/lib/perl5/DBI.pm
/usr/lib/perl5/Event.pm
...
$

faqpods - donde están las faq de perl

Encuentra aquellos archivos de documentación que comienzan por perlfaq dentro del directorio indicado por la variable de configuración installprivlib, y muestra su localización.

$ faqpods 
/usr/share/perl/5.8/pod/perlfaq.pod
/usr/share/perl/5.8/pod/perlfaq1.pod
/usr/share/perl/5.8/pod/perlfaq2.pod
/usr/share/perl/5.8/pod/perlfaq3.pod
/usr/share/perl/5.8/pod/perlfaq4.pod
/usr/share/perl/5.8/pod/perlfaq5.pod
/usr/share/perl/5.8/pod/perlfaq6.pod
/usr/share/perl/5.8/pod/perlfaq7.pod
/usr/share/perl/5.8/pod/perlfaq8.pod
/usr/share/perl/5.8/pod/perlfaq9.pod

Dónde se encuentra un módulo

pmpath - dónde está un módulo

Muestra la ruta física de todos los módulos que se le indiquen como parámetros; si éstos se omiten no se hace nada.

$ pmpath Exception::Class
/usr/share/perl5/Exception/Class.pm
$

podpath - qué archivo contiene un pod ó un módulo

Es un frontal para los programas stdpods y pmpath dependiendo de si se busca la situación de un módulo ó de una página POD estándar.

$ podpath Exception::Class
/usr/share/perl5/Exception/Class.pm
$ podpath perlfaq2
/usr/share/perl/5.8/pod/perlfaq2.pod

pmls - ls -la de un módulo

Muestra un listado completo de un módulo, ahorrándonos una secuencia de órdenes como

$ ls -l ‘pmpath Exception::Class`

podemos sustituirla por

$ pmls Exception::Class
-rw-r--r-- 1 root root 24592 2006-12-04 07:31 /usr/share/perl5/Exception/Class.pm
$

Información sobre módulos

pminst - busca módulos instalados

Muestra los nombres (y opcionalmente las rutas) de todos los módulos instalados en el sistema, ó de aquellos que cumplan un patrón determinado por una expresión regular.

  • Usa la lista de directorios contenida en @INC para buscar los módulos.
  • Con el parámetro -l muestra la ruta completa.
  • Con el parámetro -s separa el directorio del nombre del módulo.

Algunos ejemplos:

$ pminst ^Class:: 
Class::Date
Class::Date::Const
Class::Accessor
Class::DBI
Class::Singleton
Class::Trigger
Class::Virtual
Class::WhiteHole
Class::Accessor::Chained
...

$ pminst -l ^Class::
/usr/lib/perl5/Class/Date.pm
/usr/lib/perl5/Class/Date/Const.pm
/usr/share/perl5/Class/Accessor.pm
/usr/share/perl5/Class/DBI.pm
/usr/share/perl5/Class/Singleton.pm
/usr/share/perl5/Class/Trigger.pm
/usr/share/perl5/Class/Virtual.pm
/usr/share/perl5/Class/WhiteHole.pm
/usr/share/perl5/Class/Accessor/Chained.pm
...

$ pminst -s ^Class::
/usr/lib/perl5 Class::Date
/usr/lib/perl5 Class::Date::Const
/usr/share/perl5 Class::Accessor
/usr/share/perl5 Class::DBI
/usr/share/perl5 Class::Singleton
/usr/share/perl5 Class::Trigger
/usr/share/perl5 Class::Virtual
/usr/share/perl5 Class::WhiteHole
/usr/share/perl5 Class::Accessor::Chained

$ pminst -sl ^Class::
/usr/lib/perl5 Class/Date.pm
/usr/lib/perl5 Class/Date/Const.pm
/usr/share/perl5 Class/Accessor.pm
/usr/share/perl5 Class/DBI.pm
/usr/share/perl5 Class/Singleton.pm
/usr/share/perl5 Class/Trigger.pm
/usr/share/perl5 Class/Virtual.pm
/usr/share/perl5 Class/WhiteHole.pm
/usr/share/perl5 Class/Accessor/Chained.pm
/usr/share/perl5 Class/Accessor/Fast.pm

pmvers - qué versión tiene un módulo

Obtiene el número de versión de todos los módulos Perl que se le proporcionen en la llamada, siempre que éstos estén presentes. No todos los módulos Perl definen un número de versión.

$ pmvers Config::General CGI
Config::General: 2.33
CGI: 3.15
$

pmexp - qué símbolos exporta un módulo

Este programa explora un módulo e intenta identificar qué símbolos exporta utilizando el mecanismo estándar Exporter. Indica qué símbolos exporta siempre (@EXPORT), qué puede importar a petición (@EXPORT_OK) y qué conjunto de etiquetas de símbolos existen (%EXPORT_TAGS).

$ pmexp IO::File 
IO::File automatically exports SEEK_SET, SEEK_CUR, SEEK_END, O_ACCMODE,
O_ALIAS, O_APPEND, O_ASYNC, O_BINARY, O_CREAT, O_DEFER, O_DIRECT,
O_DIRECTORY, O_DSYNC, O_EXCL, O_EXLOCK, O_LARGEFILE, O_NDELAY, O_NOCTTY,
O_NOFOLLOW, O_NOINHERIT, O_NONBLOCK, O_RANDOM, O_RAW, O_RDONLY, O_RDWR,
O_RSRC, O_RSYNC, O_SEQUENTIAL, O_SHLOCK, O_SYNC, O_TEMPORARY, O_TEXT,
O_TRUNC, and O_WRONLY

pman - documentación de un módulo

Muestra la documentación de un módulo Perl (la página de manual), y es un atajo para la siguiente combinación:

$ pod2text ‘pmpath CGI‘ | $PAGER

pmall - descripción y número de version de todos los módulos

Muestra las descripciones y número de versión de todos los módulos instalados. Tarda bastante en ejecutarse (dependiendo del sistema, claro), y acepta los siguientes parámetros:

  • -v información de depuración
  • -w avisos sobre módulos sin descripción
  • -a incluír rutas relativas
  • -s ordenar la salida dentro de cada directorio

Algunos ejemplos de uso (recortados):

$ pmall 
AptPkg (1.11) - interface to libapt-pkg
APR (0.009000) - Perl Interface for Apache Portable Runtime (libapr and libaprutil Libraries)
Curses (1.13) - terminal screen handling and optimization
Cairo (1.01) - Perl interface to the cairo library
Clone (0.22) - recursively copy Perl datatypes
DBI (1.55) - Database independent interface for Perl
FreeType (1.2) - Perl extension for blah blah blah
FCGI (0.67) - Fast CGI module
GD (2.34) - Interface to Gd Graphics Library
GSSAPI (0.22) - Perl extension providing access to the GSSAPIv2 library
...
$ pmall -v 

<<Modules from /etc/perl>>


<<Modules from /usr/local/lib/perl/5.8.8>>


<<Modules from /usr/local/share/perl/5.8.8>>


<<Modules from /usr/lib/perl5>>

AptPkg (1.11) - interface to libapt-pkg
APR (0.009000) - Perl Interface for Apache Portable Runtime (libapr and libaprutil Libraries)
Curses (1.13) - terminal screen handling and optimization
Cairo (1.01) - Perl interface to the cairo library
...
$ pmall -w
        (MISSING DESC FOR /etc/perl/CPAN/Config.pm)
AptPkg (1.11) - interface to libapt-pkg
APR (0.009000) - Perl Interface for Apache Portable Runtime (libapr and libaprutil Libraries)
Curses (1.13) - terminal screen handling and optimization
...

pmdesc - descripción y versión de un módulo

Este programa obtiene el número de versión de un módulo y su descripción breve. Esta se extrae del texto que acompaña al nombre del módulo en la documentación POD, más concretamente el encabezado que incluya NAME, no importa a qué nivel.

$ pmdesc Exception::Class
Exception::Class (1.23) - A module that allows you to declare real exception classes in Perl
$ pmdesc Iterator::BreakOn
Iterator::BreakOn (0.2) - Iterator with control flow breaks

pmcat - muestra el fuente de un módulo

Dado un nombre de módulo el programa determina la ruta física y la envía al paginador del usuario.

Búsqueda en documentación

podgrep - búsqueda de párrafos en documentos POD

Este programa efectúa búsqueda mediante patrones regulares en documentos POD y extrae los párrafos que considera relevantes. La documentación puede estar mezclada con el código como en un módulo:

Acepta los siguientes parámetros:

  • -i no distingue mayúsculas de minúsculas
  • -p vuelca la salida a través del paginador del usuario, al que indicará qué buscar para que se resalte (si soporta esa característica).
  • -f convierte la salida a texto mediante pod2text.
  • -h busca en los encabezados e imprime toda la sección hasta el siguiente.

Y algunos ejemplos:

$ podgrep attributes `pmpath Exception::Class`
=head1 /usr/share/perl5/Exception/Class.pm chunk 126

This allows you to define additional attributes for your exception
class.  Any field you define can be passed to the C<throw()> or
C<new()> methods as additional parameters for the constructor.  In
addition, your exception object will have an accessor method for the
fields you define.

$ podgrep -f attributes `pmpath Exception::Class`
/usr/share/perl5/Exception/Class.pm chunk 126
    This allows you to define additional attributes for your exception
    class. Any field you define can be passed to the "throw()" or "new()"
    methods as additional parameters for the constructor. In addition, your
    exception object will have an accessor method for the fields you define.

pfcat - búsqueda de funciones en documentación POD

Este programa busca referencias a una función (mediante podgrep) en la documentación Perl y extrae los párrafos que considera relevantes.

Acepta los siguientes parámetros: - -p envía la salida al paginador del usuario - -f convierte el fuente a texto usando pod2text

$ pfcat sprintf
=head1 /usr/share/perl/5.8/pod/perlfunc.pod chunk 1280

=item sprintf FORMAT, LIST
X<sprintf>

Returns a string formatted by the usual C<printf> conventions of the C
library function C<sprintf>.  See below for more details
and see L<sprintf(3)> or L<printf(3)> on your system for an explanation of
the general principles.
...

podtoc - estructura de un POD

Muestra una tabla de contenidos de la documentación de uno ó más módulos.

$ podtoc `pmpath Iterator::BreakOn`
NAME
SYNOPSIS
DESCRIPTION
    Events order
    *  * on_first
    *  * before_XXXX
    *  * on_every
    *  * after_XXXX
    *  * on_last
INTERFACE
DIAGNOSTICS
CONFIGURATION AND ENVIRONMENT
DEPENDENCIES
    *  L<Class::Accessor>
    *  L<Exception::Class>
    *  L<Test::More>
    *  L<Text::CSV>
INCOMPATIBILITIES
BUGS AND LIMITATIONS
AUTHOR
LICENSE AND COPYRIGHT
DISCLAIMER OF WARRANTY

pmfunc - código fuente de una función

Dada una función Perl (incluyendo módulo) este programa intenta leer el archivo y volcar el código fuente de dicha función.

$ pmfunc Exception::Class::new
sub new
{
    my $proto = shift;
    my $class = ref $proto || $proto;

    my $self = bless {}, $class;

    $self->_initialize(@_);

    return $self;
}

Su debilidad reside en que, dado que es una búsqueda por patrón la que realiza la selección del fuente, aquellas funciones cargadas por otras vías no son mostradas. Es decir, aquellas que se crean mediante AUTOLOAD, alias de typeglobs y eval no pueden aparecer.

Dependencias y similares

pmload - qué módulos carga en tiempo de compilación

Dado un módulo concreto, el programa muestra los otros módulos que carga en tiempo de compilación, directa e indirectamente.

$ pmload Exception::Class
/usr/lib/perl/5.8/XSLoader.pm
/usr/share/perl/5.8/Carp.pm
/usr/share/perl/5.8/warnings/register.pm
/usr/lib/perl/5.8/Scalar/Util.pm
/usr/share/perl/5.8/Exporter.pm
/usr/share/perl/5.8/vars.pm
/usr/share/perl/5.8/strict.pm
/usr/lib/perl/5.8/List/Util.pm
/usr/share/perl5/Devel/StackTrace.pm
/usr/share/perl/5.8/warnings.pm
/usr/share/perl/5.8/base.pm
/usr/share/perl/5.8/overload.pm
/usr/share/perl5/Class/Data/Inheritable.pm
/usr/share/perl/5.8/fields.pm
/usr/share/perl5/Exception/Class.pm

Nota: este módulo está un tanto atrasado en el tiempo; el mantenedor del mismo Mark Leighton Fisher afirma que está planteándose actualizar este programa para que use algo más moderno que Devel::Loaded, dadas las limitaciones que éste tiene. En concreto, si la carga del módulo se retrasa de alguna manera no aparecerá en la información mostrada.

plxload - qué módulos se usan en tiempo de compilación

Este programa, dado un nombre de programa ó ruta directa al mismo, muestra qué módulos se están cargando mediante la directiva use; por tanto, aquellos que son cargados dinámicamente no se muestran.

Nota: las pruebas que he efectuado en mi sistema (muy someras por otra parte) han dado resultados muy negativos con este programa. Tengo que seguir investigando un poco más.

pmtools y Perl 6

Según comentaba el mantenedor en la revista The Perl Review, número v3i0, el trabajo del autor original [[Tom Christiansen|perl/personas/TomChristiansen]] es excelente, pero el paso de los años ha conseguido que algunas de las utilidades estén un tanto obsoletas, y la puesta en marcha de Perl 6, que ya puede usarse mediante Pugs, hace necesaria una actualización del mismo.

Mark indica que los futuros avances pueden estar en:

  • Mejorar el programa pxload utilizando módulos como Devel::Modlist y Module::Locate.
  • Encapsular una gran parte de su funcionalidad en un juego de módulos CPAN para aprovecharlo mejor.
  • Completar una versión de pmtools para la versión 6 de Perl. Se puede obtener más información en la página del proyecto.