2009-02-19 18 views

Répondre

9

Si vous avez chargé le module, regardez dans% INC mais vous devez le faire par nom de fichier.

say $INC{"Foo/Bar/Baz.pm"}; 

Si ce n'est pas le cas, vous pouvez utiliser Module :: Util ou le programme module_info fourni avec Module :: Info.

$ module_info Module::Build 

Name:  Module::Build 
Version:  0.30 
Directory: /usr/local/lib/site_perl 
File:  /usr/local/lib/site_perl/Module/Build.pm 
Core module: no 

Ou vous pouvez passer par @INC manuellement.

my $module = "Foo::Bar"; 

# Convert from Foo::Bar to Foo/Bar.pm 
my $file = $module; 
$file =~ s{::}{/}; 
$file .= ".pm"; 

my $path; 
for my $dir (@INC) { 
    $path = "$dir/$file"; 
    last if -r $path; 
    $path = undef; 
} 

say defined $path ? "$module is found at $path" : "$module not found"; 

(une solution de plate-forme entièrement cross utiliserait File :: Spec au lieu de se joindre à des barres obliques.)

Si vous avez juste besoin de trouver un module rapide perldoc -l, fonctionne bien comme Fayland mentionné, mais il ne parvient pas à trouver un module qui n'a pas de POD.

+0

N'oubliez pas que si vous l'extrayez de% INC, vous devez modifier un peu le nom du module. Votre premier exemple devrait être: say $ INC {"Foo/Bar/Baz.pm"} –

+0

Vous avez raison! PS Communauté wiki réponse, vous êtes libre de modifier. – Schwern

3

Doh - Je me suis juste souvenu.

use Module::Util qw(:all); 

$valid = is_valid_module_name $potential_module; 

$relative_path = module_path $module_name; 

$file_system_path = module_fs_path $module_name; 
+1

Il y a aussi le programme module_info qui est fourni avec Module :: Info. – Schwern

3

Eh bien, perldoc peut vous dire le nom du fichier:

[[email protected] ~]$ perldoc -l Catalyst 
/home/fayland/perl5/lib/perl5/Catalyst.pm 

ou consultez% INC après avoir chargé le module.

Merci.

+1

perldoc -l ne trouvera pas les modules qui n'ont pas de POD. Habituellement, ce n'est pas un problème. – Schwern