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?
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.
Rapide et sale:
$ Perl -MXML::Simple -e 1
$ 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érateursdo
,require
ouuse
. 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érateurrequire
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.
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 )
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 .
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
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é
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)
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).
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"`;
}'