web-dev-qa-db-fra.com

Comment trouver le fichier chargé par Perl lorsque j'utilise un module?

en Perl, lorsque je fais use <module name> <ver>;, le système trouve le fichier .pm pour la bibliothèque quelque part dans le chemin @INC.

Existe-t-il un moyen fiable de charger quel fichier?

45
mmccoo

Oui, %INC contient le chemin complet à partir duquel un module a été chargé.

Exemple:

$ Perl -M'Data::Dump qw(pp)' -e 'pp(\%INC)'
{
  "Data/Dump.pm"         => "/usr/share/Perl5/Data/Dump.pm",
  "Exporter.pm"          => "/usr/share/Perl/5.10/Exporter.pm",
  "List/Util.pm"         => "/usr/lib/Perl/5.10/List/Util.pm",
  "Scalar/Util.pm"       => "/usr/lib/Perl/5.10/Scalar/Util.pm",
  "XSLoader.pm"          => "/usr/lib/Perl/5.10/XSLoader.pm",
  "overload.pm"          => "/usr/share/Perl/5.10/overload.pm",
  "strict.pm"            => "/usr/share/Perl/5.10/strict.pm",
  "vars.pm"              => "/usr/share/Perl/5.10/vars.pm",
  "warnings.pm"          => "/usr/share/Perl/5.10/warnings.pm",
  "warnings/register.pm" => "/usr/share/Perl/5.10/warnings/register.pm",
}
69
derobert

Si le module a une documentation pod et si vous pouvez garantir que l'utilitaire perldoc de votre PATH appartient au même Perl qui exécute votre script, cette commande vous indiquera souvent le fichier réel trouvé:

perldoc -l ModuleName
8
skiphoppy

Perl -M'LWP '-e' utilise Data :: Dumper; imprimer Dumper \% INC '| grep LWP

Ceci listera l'emplacement du module LWP sur le disque et listera également les modules chargés à l'intérieur de LWP.

      'LWP.pm' => '/usr/lib/Perl5/5.10.0/LWP.pm',
      'LWP/Protocol.pm' => '/usr/lib/Perl5/5.10.0/LWP/Protocol.pm',
      'LWP/UserAgent.pm' => '/usr/lib/Perl5/5.10.0/LWP/UserAgent.pm',
7
user1121750

Vous voulez rechercher dans la variable %INC, qui enregistre le nom du fichier chargé pour les bibliothèques que vous chargez avec do, require ou use. Voir perlvar pour les détails.

6
brian d foy

Voici un one-liner (avec un wrapper bash) pour déterminer si un module est installé - et d'où il sera chargé:

#!/bin/bash
Perl -M${1} -le "\$mname=\"${1}.pm\";\$mname=~s#::#/#g;print \"$1 INSTALLED AT \$INC{\$mname}\";" 2>/dev/null || echo "${1} NOT INSTALLED"

Appelez-le avec la syntaxe du nom de module de Perl:

./find_Perl_module  Font::Metrics::Courier
4

CPAN contient un bon nombre de modules permettant de trouver cette information. Les candidats les plus probables semblent être Module :: Find, Module :: Which et Module :: Locate. J'irais probablement avec Module :: Locate:

use strict;
use warnings;
use Module::Locate qw/locate/;

my $to_find = "Some::Module";

print "Perl would use: ", scalar locate($to_find), "\n";

Dans le contexte de liste, localiser renvoie toutes les copies trouvées de Some :: Module dans l'ordre basé sur @INC.

Edit: derobert suggère une solution bien meilleure , je n’avais pas réalisé que% INC l’avait déjà ... Cette solution basée sur le module serait toujours utile si vous vouliez savoir avant de charger le module où elle se trouvait. allait être chargé de.

4
mikegrb

D'après ce que j'ai trouvé, Perl va chercher dans les répertoires dans le chemin:

Perl -le 'print foreach @INC'

Ensuite, il regardera dans la bibliothèque standard, puis dans le répertoire en cours.

Cela vous donne un ordre de recherche.

Ma source:

Extension du chemin de la bibliothèque

1
John

J'utilise le script shell/usr/local/bin/which_Perl_module

#!/bin/sh

if [ ! $1 ];then echo "Which Perl module should I look for?"; exit; fi

echo -n "You are using: "
perldoc -l $1
echo "which I found by looking in:"
Perl -MData::Dump=pp -e 'unshift @INC, '$1'; pp(\@INC)'
0
Alexx Roche

Module :: Mapper fournit un moyen de parcourir l'arborescence @INC pour trouver des modules:

Perl -MModule::Mapper -MData::Dumper \
-e 'print Dumper( find_sources( UseINC => 1, Modules => [ @ARGV ] ) )' \
list-of-modules-to-locate
0
Hudson

Vous pouvez utiliser la commande instmodsh: http://perldoc.Perl.org/instmodsh.html .

0
Denis Howe