Как узнать имя файла пакета Perl? - PullRequest
6 голосов
/ 19 февраля 2009

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

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

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

Ответы [ 3 ]

9 голосов
/ 19 февраля 2009

Если вы загрузили модуль, просто посмотрите в% 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 работает хорошо, как упомянул Фэйлэнд, но он не сможет найти модуль без POD.

3 голосов
/ 19 февраля 2009

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

[fayland@alpha ~]$ perldoc -l Catalyst
/home/fayland/perl5/lib/perl5/Catalyst.pm

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

Спасибо.

3 голосов
/ 19 февраля 2009

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

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