perl command-line perl-module

¿Cómo puedo verificar si un módulo Perl está instalado en mi sistema desde la línea de comandos?



command-line perl-module (10)

while (<@INC>)

Esto une las rutas en @INC juntas en una cadena, separadas por espacios, y luego llama a glob () en la cadena, que luego itera a través de los componentes separados por espacios (a menos que haya metacaracteres que combinen archivos).

Esto no funciona tan bien si hay rutas en @INC que contienen espacios, /, [], {}, *,? O ~, y no parece haber ninguna razón para evitar la alternativa segura:

for (@INC)

Intenté comprobar si XML :: Simple está instalado en mi sistema o no.

perl -e ''while (<@INC>) { while (<$_/*.pm>) { print "$_/n"; } }''

El one-liner anterior se utilizó para enumerar todos los módulos instalados en mi sistema. Sin embargo, no está enumerando módulos XML.

Sin embargo, lo siguiente se ejecuta bien.

perl -e "use XML::Simple "

¿Cuál podría ser el problema?


Creo que su solución solo buscará en la raíz de cada ruta de directorio contenida en la matriz @INC. Necesitas algo recursivo, como:

perl -e ''foreach (@INC) { print `find $_ -type f -name "*.pm"`; }''


Lo que estás haciendo allí no es recurrir a los directorios. Solo está enumerando los módulos en el directorio raíz del directorio @INC .

El módulo XML::Simple vivirá en una de las rutas @INC en XML/Simple.pm .

Lo que dijo arriba para encontrar módulos específicos.

CPAN explica cómo encontrar todos los módulos aquí, consulte Cómo encontrar módulos instalados .


Por ejemplo, para verificar si el módulo DBI está instalado o no, use

perl -e ''use DBI;''

Verás un error si no está instalado. (desde http://www.linuxask.com )


Puede verificar la ruta de instalación de un módulo de la siguiente manera:

perldoc -l XML::Simple

El problema con su one-liner es que no está recorriendo directorios / subdirectorios recursivamente. Por lo tanto, solo obtendrá nombres de módulos pragmáticos como salida.


Rápido y sucio:

$ perl -MXML::Simple -e 1


Si desea verificar rápidamente si un módulo está instalado (al menos en sistemas Unix, con Bash como shell), agregue esto a su archivo .bashrc:

alias modver="perl -e/"eval qq{use ///$ARGV[0];///////$v=///////$///${ARGV[0]}::VERSION;};/ print///$@?qq{No module found//n}:///$v?qq{Version ///$v//n}:qq{Found.//n};/"/$1"

Entonces tú puedes:

=> modver XML::Simple No module found => modver DBI Version 1.607


Si está ejecutando ActivePerl en Windows:

  • C:/>ppm query * para obtener una lista de todos los módulos instalados

  • Consulta C:/>ppm query XML-Simple para verificar si XML::Simple está instalado


Solución de Bravo for @ user80168 (¡Todavía estoy contando!) Pero para evitar todo el escape involucrado con alias y shells:

%~/ cat ~/bin/perlmod perl -le''eval qq{require $ARGV[0]; } ? print ( "Found $ARGV[0] Version: ", eval "$ARGV[0]->VERSION" ) : print "Not installed" '' $1

funciona razonablemente bien

Aquí podría ser el enfoque más simple y más "moderno", utilizando Module::Runtime :

perl -MModule::Runtime=use_module -E '' say "$ARGV[0] ", use_module($ARGV[0])->VERSION'' DBI

Esto dará un error útil si el módulo no está instalado.

El uso de -MModule::Runtime requiere que esté instalado (no es un módulo principal).


$ perl -MXML::Simple -le ''print $INC{"XML/Simple.pm"}''

Desde la entrada de perlvar en %INC :

  • %Cª

El hash %INC contiene entradas para cada nombre de archivo incluido a través de los operadores do , require o use . La clave es el nombre de archivo que especificó (con los nombres de los módulos convertidos a nombres de ruta), y el valor es la ubicación del archivo encontrado. El operador require usa este hash para determinar si un archivo en particular ya ha sido incluido.

Si el archivo se cargó a través de un enlace (por ejemplo, una referencia de subrutina, consulte require una descripción de estos enlaces), este enlace se inserta por defecto en %INC en lugar de un nombre de archivo. Sin embargo, tenga en cuenta que el enganche puede haber configurado la entrada% INC por sí mismo para proporcionar información más específica.