web-dev-qa-db-fra.com

Comment puis-je vérifier si un module Perl est installé sur mon système à partir de la ligne de commande?

J'ai essayé de vérifier si XML :: Simple est installé sur mon système ou non.

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

Le one-liner ci-dessus a été utilisé pour répertorier tous les modules installés dans mon système. Cependant, il ne s'agit pas d'une liste de modules XML.

Cependant, ce qui suit s'exécute bien.

Perl -e "use XML::Simple "

Quel pourrait être le problème?

56
joe

Vous pouvez vérifier le chemin d'installation d'un module en:

perldoc -l XML::Simple

Le problème avec votre one-liner est qu’il ne traverse pas récursivement les répertoires/sous-répertoires. Par conséquent, vous n'obtenez que des noms de modules pragmatiques en sortie.

92
Alan Haggai Alavi

Rapide et sale:

$ Perl -MXML::Simple -e 1
39
Sinan Ünür
$ Perl -MXML :: Simple -le 'print $ INC {"XML/Simple.pm"}'

À partir de l'entrée perlvar sur %INC :

  • % INC

Le hash %INC contient les entrées pour chaque nom de fichier inclus via les opérateurs do, require ou use. La clé est le nom de fichier que vous avez spécifié (avec les noms de modules convertis en noms de chemins), et la valeur est l'emplacement du fichier trouvé. L'opérateur require utilise ce hachage pour déterminer si un fichier particulier a déjà été inclus.

Si le fichier a été chargé via un hook (par exemple une référence de sous-routine, voir requis pour une description de ces hooks), ce hook est par défaut inséré dans %INC à la place d'un nom de fichier. Notez cependant que le hook peut avoir défini l'entrée% INC par elle-même pour fournir des informations plus spécifiques.

17
Greg Bacon

Par exemple, pour vérifier si le module DBI est installé ou non, utilisez

Perl -e 'use DBI;'

Vous verrez une erreur s'il n'est pas installé. (de http://www.linuxask.com )

12
Hamidjon

Ce que vous faites n’est pas récurrent dans les répertoires. Il ne fait que lister les modules dans le répertoire racine du @INC répertoire.

Le module XML::Simple va vivre dans l'un des @INC chemins sous XML/Simple.pm.

Ce qu'il a dit ci-dessus pour trouver des modules spécifiques.

CPAN explique comment trouver tous les modules ici, voir Comment trouver les modules installés .

9
Salgar

Si vous voulez vérifier rapidement si un module est installé (au moins sur les systèmes Unix, avec Bash en tant que Shell), ajoutez ceci à votre fichier .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"

Ensuite vous pouvez:

=> modver XML::Simple
No module found

=> modver DBI
Version 1.607
8
user80168

Si vous utilisez ActivePerl sous Windows:

  • C:\>ppm query * pour obtenir une liste de tous les modules installés

  • C:\>ppm query XML-Simple pour vérifier si XML::Simple est installé

3
Zaid

tant que (<@INC>)

Cela réunit les chemins de @INC dans une chaîne, séparés par des espaces, puis appelle glob () sur la chaîne, qui itère ensuite à travers les composants séparés par des espaces (sauf s’il existe des méta-caractères de remplacement de fichier).

Cela ne marche pas aussi bien s'il y a des chemins dans @INC contenant des espaces, \, [], {}, *,? Ou ~, et il semble n'y avoir aucune raison d'éviter l'alternative sûre:

for (@INC)
3
ysth

Bravo pour la solution de @ user80168 (je compte toujours \ '! s!) mais pour éviter toutes les fugues liées aux pseudonymes et aux coquillages:

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

fonctionne assez bien.

Voici peut-être l'approche la plus simple et la plus "moderne", utilisant Module::Runtime :

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

Cela donnera une erreur utile si le module n'est pas installé.

En utilisant -MModule::Runtime nécessite son installation (il ne s’agit pas d’un module de base).

0
G. Cito

Je pense que votre solution ne cherchera que dans la racine de chaque chemin de répertoire contenu dans le tableau @INC. Vous avez besoin de quelque chose de récursif, comme:

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