Я хотел бы перевести имя пакета Perl на полный путь к файлу.Как узнать имя файла Perl?
say package_name_to_path('Foo::Bar::Baz');
/tmp/Foo/Bar/Baz.pm
Я знаю, что для этого есть модуль CPAN? Я просто не могу найти его снова?
Я хотел бы перевести имя пакета Perl на полный путь к файлу.Как узнать имя файла Perl?
say package_name_to_path('Foo::Bar::Baz');
/tmp/Foo/Bar/Baz.pm
Я знаю, что для этого есть модуль CPAN? Я просто не могу найти его снова?
Если вы загрузили модуль, просто посмотрите в% 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.
Дох - я только что вспомнил.
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;
Существует также программа module_info, которая поставляется с Module :: Info. – Schwern
Ну, perldoc может сказать вам имя файла:
[[email protected] ~]$ perldoc -l Catalyst
/home/fayland/perl5/lib/perl5/Catalyst.pm
или посмотреть в% INC после того как вы загрузили модуль.
Спасибо.
perldoc -l не найдет модули, у которых нет POD. Обычно это не проблема. – Schwern
Не забудьте, если вы вытащили его из% INC, вам нужно немного изменить название модуля. Ваш первый пример должен быть: say $ INC {"Foo/Bar/Baz.pm"} –
Вы правы! Ответ сообщества Wiki сообщества, вы можете редактировать. – Schwern