2011-01-23 18 views
7

Estoy usando Term::ANSIColor en mi script Perl para hacer la coloración de la salida del terminal, y estoy usando la función colorstrip, que solo se agregó en Term::ANSIColor versión 2.01, de acuerdo con el registro de cambios. Entonces, ¿hay alguna manera de hacer que mi script automáticamente die con un mensaje de error apropiado si no encuentra al menos esa versión de Term::ANSIcolor?¿Cómo uso una determinada versión (o superior) de un módulo perl en mi script perl?

Respuesta

21

Justo:

use Term::ANSIColor 2.01; 

Ver perldoc -f use:

uso Módulo VERSIÓN LISTA

Si el argumento VERSIÓN está presente entre el módulo y la lista, entonces el uso llamará al Método VERSIÓN en clase Módulo con la versión dada como argumento. El método VERSIÓN predeterminado, heredado de la clase UNIVERSAL, croaks si la versión dada es mayor que el valor de la variable $ Module :: VERSION.

7

La mayoría de los módulos definen la variable del paquete $VERSION.

use Term::ANSIColor; 
die "Sorry, this program needs Term::ANSIColor >= v2.01!\n" 
    unless $Term::ANSIColor::VERSION >= 2.01; 

Esta es también una buena manera de especificar un máximo versión de un módulo.

use Module::Foo; 
die "You need an *older* version of Module::Foo that ", 
    "still has the &barbaz method defined" 
    if $Module::Foo::VERSION >= 0.47; 
+0

Es una buena forma de hacerlo. Cuando suministra una versión en la lista de importación, confía en el método de importación que realmente maneja esto. No solo eso, la técnica de importación solo requiere esa versión o posterior. Si quieres una versión o rango de versiones en particular, terminas con esta técnica más general. –

+1

En realidad, no se necesita ayuda del método 'import'; cuando usa' use' o 'require' con un número de versión, se genera una llamada al método' VERSION'. Pero cada paquete que no lo anula específicamente obtiene un método adecuado de 'VERSIÓN' de 'UNIVERSAL'. – hobbs

+0

@brian probablemente debería haberlo etiquetado en el mensaje anterior, así que ahora estoy :) – hobbs

2

basta con especificar la versión que desea utilizar:

use Some::Module 2.13; 

Si la versión no es al menos 2,13, la operación fallará.

Usted puede experimentar con la versión que está disponible en la línea de comandos:

perl -MSome::Module=9999 -e 'exit 0' 

Esto suele morir con el número de versión incorrecta se muestra en el mensaje de error (a menos que el módulo que está tratando de utilizar sucede tener un número de versión de 5 dígitos o más, o a menos que el módulo sea como strict y no le gusta que se cargue a través de la línea de comando con un número de versión o como URI (ver los comentarios para más detalles)).

$ perl -MFile::Find=999 -e 'exit 0' 
File::Find version 999 required--this is only version 1.07 at 
/usr/perl5/5.8.4/lib/Exporter/Heavy.pm line 121. 
BEGIN failed--compilation aborted. 
$ perl -e 'use File::Find 999; exit 0' 
File::Find version 999 required--this is only version 1.07 at -e line 1. 
BEGIN failed--compilation aborted at -e line 1. 
$ 

Ejecutar en una máquina que normalmente no uso, de ahí la versión anticuada de Perl.

+3

Los dos son sutilmente diferentes; la línea de comando -M switch nunca especifica una VERSIÓN para usar; en su lugar, lo proporciona como un parámetro para la rutina de importación del módulo, y los módulos que usan Exporter hacen una verificación de versión. Pero no todos los módulos usan Exporter. – ysth

+0

Esto no funciona de manera confiable con todos los módulos, por lo que no es una técnica general, como dice ysth. –

+1

@ysth y @brian: OK - tomo su palabra; No lo he probado en todos los módulos de CPAN, pero la única vez que me he encontrado con un problema con los números de versión es con los submódulos de un módulo principal que no configuran de manera confiable su propia versión. ¿Puedes dar una o dos instancias de módulos donde no funciona? –

Cuestiones relacionadas