En plus d'essayer
perldoc <module name>
individuellement pour chaque module CPAN qui me plait ou passe en revue le système de fichiers et les répertoires, je ne sais pas du tout quels modules nous avons installés.
Quel est le moyen le plus simple d’obtenir une grande liste de tous les modules CPAN installés? En ligne de commande ou autre.
Ceci est répondu dans la FAQ Perl, la réponse qui peut être rapidement trouvée avec perldoc -q installed
. En bref, cela revient à utiliser ExtUtils::Installed
ou à utiliser File::Find
, des variantes des deux qui ont déjà été abordées dans ce fil de discussion.
Vous pouvez également trouver l'entrée FAQ "Comment trouver les modules installés sur mon système?" en perlfaq3. Vous pouvez voir une liste de toutes les réponses FAQ en regardant dans perlfaq
perldoc perllocal
Edit: Il y a (un peu) plus d'infos à ce sujet dans le CPAN FAQ
perldoc -q installed
affirme que cpan -l
fera l'affaire, mais cela ne fonctionne pas pour moi. L'autre option:
cpan -a
crache une liste de Nice des paquets installés et a pour effet de Nice de les écrire dans un fichier.
Il est à noter que perldoc perllocal ne rend compte que des modules installés via CPAN. Si quelqu'un installe les modules manuellement, il ne les trouvera pas. De même, si plusieurs personnes installent des modules et que perllocal.pod est sous contrôle de source, il est possible que les personnes résolvent les conflits de manière incorrecte et corrompent la liste (c'est ce qui s'est passé ici au travail, par exemple).
Malheureusement, la solution semble être en train de parcourir @INC avec File :: Find ou quelque chose de similaire. Cependant, cela ne concerne pas uniquement les modules, il recherche également les modules associés dans une distribution. Par exemple, il signalerait TAP :: Harness et TAP :: Parser en plus du nom de distribution réel de Test :: Harness (en supposant que vous disposiez de la version 3 ou supérieure). Vous pouvez éventuellement les associer à des noms de distribution et supprimer ceux qui ne correspondent pas, mais vous pouvez également supprimer les modules créés et installés localement.
Je pense que le travail d’indexation de la face arrière de brian d foy est supposé avoir du code pour le remettre au fichier .pm et il tentera de déduire la distribution, mais cela échoue parfois car le contenu d’un paquet n’est pas nécessairement installé (voir :: Inc pour un exemple).
Vous pouvez essayer ExtUtils-Installed , mais cela ne regarde que dans .packlist
s, de sorte qu'il peut manquer des modules pour lesquels des personnes ont déplacé des éléments dans @INC
à la main.
J'ai écrit App-Module-Lister pour un ami qui voulait le faire en tant que script CGI sur un compte d'hébergement Web autre que Shell. Vous prenez simplement le fichier de module et le chargez en tant que nom de fichier que votre serveur traitera comme un script CGI. Il n'a pas de dépendances en dehors de la bibliothèque standard. Utilisez-le tel quel ou volez le code.
Il sort une liste des modules et leurs versions:
Tie :: Cycle 1.15 Tie :: IxHash 1.21 Tie :: Toggle 1.07 Tie :: ToObject 0,03 Time :: CTime 99.062201 Time :: DaysInMonth 99.1117 Time :: Epoch 0.02 Time :: Fuzzy 0,34 Time :: JulianDay 2003.1125 Time :: ParseDate 2006.0814 Time :: Timezone 2006.0814
Je voulais ajouter cela en tant que fonctionnalité à l'outil cpan
, je vais donc le faire aussi. [Le temps passe] Et maintenant, j'ai un commutateur -l
dans cpan
. J'ai quelques autres choses à faire avec cela avant de faire une sortie, mais c'est en github . Si vous ne voulez pas attendre pour cela, vous pouvez simplement essayer le commutateur -a
pour créer un regroupement automatique, bien que cela mette un certain Pod à la liste.
Bonne chance;
$ for M in `perldoc -t perllocal|grep Module |sed -e 's/^.*" //'`; do V=`perldoc -t perllocal|awk "/$M/{y=1;next}y" |grep VERSION |head -n 1`; printf "%30s %s\n" "$M" "$V"; done |sort
Class::Inspector * "VERSION: 1.28"
Crypt::CBC * "VERSION: 2.33"
Crypt::Rijndael * "VERSION: 1.11"
Data::Dump * "VERSION: 1.22"
DBD::Oracle * "VERSION: 1.68"
DBI * "VERSION: 1.630"
Digest::SHA * "VERSION: 5.92"
ExtUtils::MakeMaker * "VERSION: 6.84"
install * "VERSION: 6.84"
IO::SessionData * "VERSION: 1.03"
IO::Socket::SSL * "VERSION: 2.016"
JSON * "VERSION: 2.90"
MIME::Base64 * "VERSION: 3.14"
MIME::Base64 * "VERSION: 3.14"
Mozilla::CA * "VERSION: 20141217"
Net::SSLeay * "VERSION: 1.68"
parent * "VERSION: 0.228"
REST::Client * "VERSION: 271"
SOAP::Lite * "VERSION: 1.08"
Task::Weaken * "VERSION: 1.04"
Term::ReadKey * "VERSION: 2.31"
Test::Manifest * "VERSION: 1.23"
Test::Simple * "VERSION: 1.001002"
Text::CSV_XS * "VERSION: 1.16"
Try::Tiny * "VERSION: 0.22"
XML::LibXML * "VERSION: 2.0108"
XML::NamespaceSupport * "VERSION: 1.11"
XML::SAX::Base * "VERSION: 1.08"
Voici un script qui ferait l'affaire:
use ExtUtils::Installed;
my $inst = ExtUtils::Installed->new();
my @modules = $inst->modules();
foreach $module (@modules){
print $module ." - ". $inst->version($module). "\n";
}
=head1 ABOUT
This scripts lists installed cpan modules using the ExtUtils modules
=head1 FORMAT
Prints each module in the following format
<name> - <version>
=cut
J'aime utiliser la commande 'r' CPAN pour cela. Vous pouvez entrer dans le shell CPAN avec l'ancien style:
Sudo Perl -MCPAN -e Shell
ou, sur la plupart des systèmes plus récents, il existe une commande 'cpan', cette commande vous permet donc d'accéder au shell:
Sudo cpan
(Vous devez généralement utiliser 'Sudo' pour l'exécuter en tant que root ou 'su -' pour devenir root avant de l'exécuter, sauf si cpan est configuré pour vous permettre de l'exécuter en tant qu'utilisateur normal, mais installez-le en tant que root. Si vous ne disposez pas de root sur cette machine, vous pouvez toujours utiliser le shell CPAN pour obtenir ces informations, mais vous ne pourrez pas installer de modules et vous devrez peut-être effectuer une configuration un peu la première fois. exécuter.)
Ensuite, une fois que vous êtes dans le shell cpan, vous pouvez utiliser la commande 'r' pour signaler tous les modules installés et leurs versions. Ainsi, à l'invite "cpan>", tapez "r". Ceci listera tous les modules installés et leurs versions. Utilisation '?' pour obtenir plus d'aide.
Voici une façon très astucieuse de le faire dans * nix, vous obtiendrez des choses qui ne vous intéressent pas vraiment (par exemple: warnings :: register etc.), mais il devrait vous donner une liste de chaque fichier .pm accessible via Perl.
for my $path (@INC) {
my @list = `ls -R $path/**/*.pm`;
for (@list) {
s/$path\///g;
s/\//::/g;
s/\.pm$//g;
print;
}
}
Vous pouvez obtenir la liste des modules Perl installés dans votre système en utilisant la commande instmodsh
de votre terminal. Il vous demandera trois options pour améliorer le résultat:
l - List all installed modules
m <module> - Select a module
q - Quit the program
Perl -MFile::Find=find -MFile::Spec::Functions -Tlwe 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC'
La réponse se trouve dans la liste Perl FAQ .
Vous devriez feuilleter l'excellente documentation fournie avec Perl
perldoc perltoc
Essayez man perllocal
ou perldoc perllocal
.
Voici un document Perl one-liner qui imprimera une liste des modules installés:
Perl -MExtUtils::Installed -MData::Dumper -e 'my ($inst) = ExtUtils::Installed->new(); print Dumper($inst->modules());'
Assurez-vous simplement que Data :: Dumper est installé.
Essayez la commande suivante
instmodsh
Pour parcourir les arborescences de répertoires @INC sans utiliser de programme externe comme ls (1), vous pouvez utiliser le module File::Find::Rule
, qui possède une interface déclarative Nice.
Vous souhaitez également éliminer les doublons si les versions précédentes de Perl contiennent les mêmes modules. Le code pour faire cela ressemble à:
#! /usr/bin/Perl -l
use strict;
use warnings;
use File::Find::Rule;
my %seen;
for my $path (@INC) {
for my $file (File::Find::Rule->name('*.pm')->in($path)) {
my $module = substr($file, length($path)+1);
$module =~ s/.pm$//;
$module =~ s{[\\/]}{::}g;
print $module unless $seen{$module}++;
}
}
À la fin de l'exécution, vous avez également tous les noms de vos modules sous forme de clés dans le hachage% seen. Le code pourrait être adapté pour enregistrer le nom de fichier canonique (donné dans $ file) en tant que valeur de la clé au lieu du nombre de fois vu.
J'ai écrit un script Perl hier pour faire exactement cela. Le script renvoie la liste des modules Perl installés dans @INC en utilisant "::" comme séparateur. Appelez le script en utilisant -
Perl perlmod.pl
OU
Perl perlmod.pl <module name> #Case-insensitive(eg. Perl perlmod.pl ftp)
A partir de maintenant, le script ignore le répertoire en cours ('.') Car j'avais des problèmes avec les liens symboliques récurrents, mais vous pouvez l'inclure en modifiant la fonction grep dans la ligne 17 de
grep { $_ !~ '^\.$' } @INC
pour juste,
@INC
Le script peut être trouvé ici.
Voici encore un autre outil de ligne de commande pour répertorier tous les fichiers .pm installés:
Trouver les modules Perl installés correspondant à une expression régulière
Sur Linux/Unix, j'utilise cette commande simple:
Perl -e 'print qx/find $_ -name "*.pm"/ foreach ( @INC );'
Il analyse tous les dossiers dans @INC
et recherche tous les fichiers * .pm.
Lorsque vous entrez dans votre script Perl, vous avez tous les modules installés sous forme de fichiers .pm sous les dossiers de @INC. Un petit script bash fera le travail pour vous:
#!/bin/bash
echo -e -n "Content-type: text/plain\n\n"
inc=`Perl -e '$, = "\n"; print @INC;'`
for d in $inc
do
find $d -name '*.pm'
done
Ce qui suit a fonctionné pour moi.
$ perldoc perllocal | grep Module
$ perldoc perllocal | grep -E 'VERSION|Module'
le livre de recettes Perl contient plusieurs itérations du script "pmdesc" qui fait ce que vous voulez. Sur Google, recherchez "Perl Cookbook pmdesc" et vous trouverez des articles sur d'autres sites de questions-réponses , plusieurs listes de codes sur le net, une discussion de la solution, et même quelques améliorations .
cd /the/lib/dir/of/your/Perl/installation
perldoc $(find . -name perllocal.pod)
Les utilisateurs Windows effectuent simplement une recherche dans l'Explorateur Windows pour le trouver.