Pregunta

¿Cómo encuentra la versión de un módulo Perl instalado?

Esto está en una respuesta en la parte inferior, pero creo que es lo suficientemente importante como para vivir aquí. Con estas sugerencias, creo una función en mi .bashrc

function perlmodver {
    perl -M$1 -e 'print "Version " . $ARGV[0]->VERSION . " of " . $ARGV[0] . \
    " is installed.\n"' $1
}
¿Fue útil?

Solución

¿Por qué intentas obtener la versión del módulo? ¿Necesita esto desde dentro de un programa, solo necesita el número para pasar a otra operación, o simplemente está tratando de averiguar lo que tiene?

Tengo esto integrado en el cpan (que viene con perl) con el interruptor -D para que pueda ver la versión que ha instalado y la versión actual en CPAN:

$ cpan -D Text::CSV_XS

Text::CSV_XS
-------------------------------------------------------------------------
        Fast 8bit clean version of Text::CSV
        H/HM/HMBRAND/Text-CSV_XS-0.54.tgz
        /usr/local/lib/perl5/site_perl/5.8.8/darwin-2level/Text/CSV_XS.pm
        Installed: 0.32
        CPAN:      0.54  Not up to date
        H.Merijn Brand (HMBRAND)
        h.m.brand@xs4all.nl

Si desea ver todos los módulos desactualizados, use el interruptor -O (mayúscula):

$ cpan -O
Module Name                                Local    CPAN
-------------------------------------------------------------------------
Apache::DB                                0.1300  0.1400
Apache::SOAP                              0.0000  0.7100
Apache::Session                           1.8300  1.8700
Apache::SizeLimit                         0.0300  0.9100
Apache::XMLRPC::Lite                      0.0000  0.7100
... and so on

Si desea ver esto para todos los módulos que ha instalado, pruebe el interruptor -a para crear un auto-paquete.

Otros consejos

La mayoría de los módulos (especialmente los de The CPAN) tienen una variable $ VERSION:

perl -MSome::Module -le 'print $Some::Module::VERSION'

VERSIÓN es un método de UNIVERSAL de todas las clases de Perl. Puede usarlo para obtener la versión del módulo (si se ha configurado, lo que generalmente tiene).

Aquí hay un liner donde solo tiene que agregar el nombre del módulo una vez:

perl -le 'eval "require $ARGV[0]" and print $ARGV[0]->VERSION' Some::Module

Hay un truco de menos escritura, que funciona siempre y cuando su módulo no tenga una locura como la marca de tiempo de Unix como número de versión.

perl -MFoo::Bar\ 9999

Esto funciona porque lo que se traduce es

use Foo::Bar 9999;

es decir, una versión de Foo :: Bar que sea al menos la versión 9999 o más reciente. Y lo que obtienes es

Foo::Bar version 9999 required--this is only version 1.1.
BEGIN failed--compilation aborted.

(Truco limpio que aprendí de Matt Trout.)

Si tiene suerte, el módulo tendrá una variable de paquete llamada $ VERSION :

$ perl -MCPAN -e 'print "$CPAN::VERSION\n"'
1.9205

Esto es necesario para que los módulos se distribuyan en CPAN, pero los módulos desarrollados internamente pueden seguir una convención diferente o ninguno en absoluto.

Gracias por las respuestas! He creado una función en mi .bashrc para encontrar fácilmente la versión de un módulo Perl:

function perlmodver {
    perl -M$1 -e 'print $ARGV[0]->VERSION . "\n"' $1
} 

Consulte las secuencias de comandos pmtools en CPAN. Si está utilizando una distribución Debian (basada en), también hay un útil pmtools paquete . Esto incluye una secuencia de comandos " pmvers " Eso te dice la versión de un módulo. Es bastante práctico.

Hace algo similar a las diversas personas de una línea publicadas, pero es un poco más inteligente sobre el manejo de errores y puede ofrecerle la versión de más de un módulo a la vez.

Escribí un pequeño script para informar que: perlver .

  

Esta es una pequeña herramienta simple que   te dice qué versión de un módulo te   han instalado, y donde el archivo .pm   se encuentra. También asegura el módulo.   se puede cargar con éxito. Eso   Convierte automáticamente & # 8216; - & # 8217 ;, & # 8216; / & # 8217 ;, o   & # 8216; \ & # 8217; a & # 8216; :: & # 8217 ;, para que pueda usar una ruta de acceso   o nombre de la distribución en lugar de la   Nombre del módulo canónico.

Se supone que el módulo define una $ VERSION. Si el módulo no define una VERSIÓN de $, aún le indicará dónde se encuentra el archivo .pm , para que pueda examinarlo manualmente. También puedes consultar varios módulos a la vez:

$ perlver CPAN DBD-Pg Getopt::Long
CPAN 1.7602 is
 /usr/lib/perl5/5.8.8/CPAN.pm
DBD::Pg 1.49 is
 /usr/lib/perl5/vendor_perl/5.8.8/i686-linux/DBD/Pg.pm
Getopt::Long 2.36 is
 /usr/lib/perl5/vendor_perl/5.8.8/Getopt/Long.pm

La versión más fácil de recordar y más robusta para mí:

perl -e 'use Search::Elasticsearch; print $Search::Elasticsearch::VERSION;'

Además, para los módulos que usan Exporter.pm, puede obtener esta información con este truco:

perl -MSome::Module=99999 -ex
Some::Module version 99999 required--this is only version 1.9205 at ...

Para los módulos que no usan Exporter.pm, un truco un poco más largo reporta la misma información:

perl -e'use Some::Module 99999'
Some::Module version 99999 required--this is only version 1.9205 at ...

Tenemos el sistema perl (/ usr / bin / perl) en Solaris 10, y las soluciones anteriores son inútiles. Algunos de ellos informan que " module.pm no está instalado " ;, algunos de ellos no tienen salida.

Aquí está el código que es útil, que puede enumerar todos los módulos y su versión.

#!/usr/bin/perl

use strict;
use ExtUtils::Installed;

my @modules;
my $installed = ExtUtils::Installed->new();

if (scalar(@ARGV) > 0) {

    @modules = @ARGV;

} else {

    @modules = $installed->modules();

}

print "Module\tVersion\n";

foreach (@modules) {

    print 

Tenemos el sistema perl (/ usr / bin / perl) en Solaris 10, y las soluciones anteriores son inútiles. Algunos de ellos informan que " module.pm no está instalado " ;, algunos de ellos no tienen salida.

Aquí está el código que es útil, que puede enumerar todos los módulos y su versión.

<*> . "\t" . $installed->version(

Tenemos el sistema perl (/ usr / bin / perl) en Solaris 10, y las soluciones anteriores son inútiles. Algunos de ellos informan que " module.pm no está instalado " ;, algunos de ellos no tienen salida.

Aquí está el código que es útil, que puede enumerar todos los módulos y su versión.

<*>) . "\n"; }

También puede consultar App :: module :: version

$ module-version

The version of App::module::version in /home/yourself/perl5/lib/perl5 is 1.004
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top