2009-02-19 4 views
6

Я хотел бы перевести имя пакета Perl на полный путь к файлу.Как узнать имя файла Perl?

say package_name_to_path('Foo::Bar::Baz'); 
/tmp/Foo/Bar/Baz.pm 

Я знаю, что для этого есть модуль CPAN? Я просто не могу найти его снова?

ответ

9

Если вы загрузили модуль, просто посмотрите в% INC, но вы должны сделать это по имени файла.

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

Если вы этого не сделали, вы можете использовать Module :: Util или программу module_info, которая поставляется с 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 

Или вы можете пройти через @INC вручную.

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"; 

(Полностью кроссплатформенное решение будет использовать File :: Spec вместо объединения с косой чертой.)

Если вам просто нужно найти модуль быстро, perldoc -l работает хорошо, как упоминалось Fayland, но это будет не удается найти модуль, который не имеет POD.

+0

Не забудьте, если вы вытащили его из% INC, вам нужно немного изменить название модуля. Ваш первый пример должен быть: say $ INC {"Foo/Bar/Baz.pm"} –

+0

Вы правы! Ответ сообщества Wiki сообщества, вы можете редактировать. – Schwern

3

Дох - я только что вспомнил.

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

Существует также программа module_info, которая поставляется с Module :: Info. – Schwern

3

Ну, perldoc может сказать вам имя файла:

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

или посмотреть в% INC после того как вы загрузили модуль.

Спасибо.

+1

perldoc -l не найдет модули, у которых нет POD. Обычно это не проблема. – Schwern

 Смежные вопросы

  • Нет связанных вопросов^_^