¿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 instaladosConsulta
C:/>ppm query XML-Simple
para verificar siXML::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 operadoresdo
,require
ouse
. 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 operadorrequire
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.