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