web-dev-qa-db-fra.com

Comment savoir où est installé un module Perl?

Comment obtenir le chemin d'un module Perl installé par son nom, par exemple Time::HiRes?

Je le veux juste parce que je dois exécuter mon script Perl sur différents nœuds d'un système SGE Grid Engine. Parfois, même exécuté sous un autre nom d'utilisateur.

Je peux utiliser CPAN.pm pour installer des packages pour moi-même, mais ce n'est pas si facile à installer pour d'autres utilisateurs sans chmod 666 sur des dossiers.

41
Galaxy

J'ai créé (whichpm , une CLI multiplateforme (Linux, OSX, Window) qui localise les modules Perl installés par nom de module (package) , et rapporte éventuellement des informations à leur sujet, y compris la détection de doublons accidentels.

Exemples

# Locate the Data::Dumper module.
$ whichpm Data::Dumper
/usr/lib/Perl/5.18/Data/Dumper.pm

# Locate the Data::Dumper module, and also print
# version information and core-module status.
$ whichpm -v Data::Dumper
Data::Dumper    2.145   core>=5.005 /usr/lib/Perl/5.18/Data/Dumper.pm

# Locate the Data::Dumper module and open it in your system's default text
# editor.
$ whichpm -e Data::Dumper

# Look for accidental duplicates of the Foo::Bar module.
# Normally, only 1 path should be returned.
$ whichpm -a Foo::Bar
/usr/lib/Perl/5.18/Foo/Bar.pm
./Foo/Bar.pm

# Print the paths of all installed modules.
$ whichpm -a

Installation

Prérequis: Linux , [~ # ~] osx [~ # ~] , ou Windows , avec Perl v5.4.50 ou supérieur installé.

Installation à partir du registre npm

Avec Node.js ou io.js installé, installez le package comme suit:

[Sudo] npm install whichpm -g

Installation manuelle (OSX et Linux)

  • Téléchargez la CLI en tant que whichpm.
  • Rendez-le exécutable avec chmod +x whichpm.
  • Déplacez-le ou créez un lien symbolique vers un dossier dans votre $PATH, tel que /usr/local/bin (OSX) ou /usr/bin (Linux).
17
mklement0

Perl -MTime::HiRes -e 'print $INC{"Time/HiRes.pm"}' ou perldoc -l Time::HiRes

73
jrockway

Vous pouvez obtenir les détails du module avec l'outil cpan fourni avec Perl:

$ cpan -D Time::HiRes
Time::HiRes
-------------------------------------------------------------------------
    High resolution time, sleep, and alarm
    J/JH/JHI/Time-HiRes-1.9719.tar.gz
    /usr/local/perls/Perl-5.10.0/lib/5.10.0/darwin-2level/Time/HiRes.pm
    Installed: 1.9711
    CPAN:      1.9719  Not up to date
    Andrew Main (Zefram) (ZEFRAM)
    [email protected]

Il fonctionne même sur des modules que vous n'avez pas installés:

$ cpan -D Win32::Process
Win32::Process
-------------------------------------------------------------------------
    Interface to Win32 Process functions
    J/JD/JDB/Win32-Process-0.14.tar.gz
    Installed: 
    CPAN:      0.14  Not up to date
    Jan Dubois (JDB)
    [email protected]

Je pense que j'ai peut-être besoin d'une option XML comme svn.

21
brian d foy

Si vous avez besoin de trouver les modules réellement utilisés par votre script, vous pouvez utiliser la commande M du débogueur Perl:

 [ivan @ server ~] $ Perl -d your_script.pl 
 ... 
 
 Le programme débogué s'est terminé. Utilisez q pour quitter ou R pour redémarrer, 
 Utilisez o inhibit_exit pour éviter l'arrêt après la fin du programme, 
 Hq, h R ou ho pour obtenir des informations supplémentaires. 
 
 DB M. Perl5/5.8.8/Carp.pm '
 ... 

Cela vous aidera dans le cas où vous avez des modules avec les mêmes noms mais dans un dossier différent.

5
Ivan Nevostruev

J'en trouve juste un autre: http://www.perlmonks.org/?node_id=5687

#!/bin/sh

echo 'print map { sprintf( "%20s : %s\n", $_, $INC{$_} ) } sort keys %INC; print "\n'$1' version : $'$1'::VERSION\n\n"' | Perl "-M$1" 

le script affiche tout simplement dans% INC lorsque vous exécutez Perl -MSTH::STH

par exemple:

$ whichpm CGI       
              CGI.pm : /System/Library/Perl/5.8.6/CGI.pm
         CGI/Util.pm : /System/Library/Perl/5.8.6/CGI/Util.pm
             Carp.pm : /System/Library/Perl/5.8.6/Carp.pm
         Exporter.pm : /System/Library/Perl/5.8.6/Exporter.pm
         constant.pm : /System/Library/Perl/5.8.6/constant.pm
         overload.pm : /System/Library/Perl/5.8.6/overload.pm
           strict.pm : /System/Library/Perl/5.8.6/strict.pm
             vars.pm : /System/Library/Perl/5.8.6/vars.pm
         warnings.pm : /System/Library/Perl/5.8.6/warnings.pm warnings/register.pm : /System/Library/Perl/5.8.6/warnings/register.pm

CGI version : 3.05
4
Galaxy

J'aime utiliser le module V .

Installez-le simplement depuis CPAN ou en installant le package libv-Perl sur Debian ou Ubuntu.

Ensuite, utilisez-le comme ceci:

$ Perl -MV=DBI
DBI
    /Users/michiel/.plenv/versions/5.24.0/lib/Perl5/site_Perl/5.24.0/darwin-2level/DBI.pm: 1.636

Autre exemple de sortie:

$ Perl -MV=Time::HiRes
Time::HiRes
    /usr/lib/Perl/5.18/Time/HiRes.pm: 1.9725
3
MichielB

Il semble que le moyen le plus simple soit perldoc -l Time::HiRes.


Si cela n'est pas disponible pour une raison quelconque, voici une solution pragmatique:

Étape 1: Instancier le module dans votre script ...

#! /usr/bin/Perl -w
use Time::HiRes();
new Time::HiRes();

Étape 2: Exécutez le script avec le débogueur graphique Perl ...

export Perl5LIB=$Perl5LIB:~/Perl ## tell Perl where to look for "Devel"/"ptkdb.pm"
Perl -d:ptkdb (yourscript.pl)

Étape 3: Step in à l'appel new.

Le chemin complet du module sera affiché dans la barre de titre de la fenêtre du débogueur.


Une autre approche qui pourrait être utile serait de rechercher tous les dossiers dans $Perl5LIB.

1
nobar