我想将 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 的模块。
关于perl - 如何找出 Perl 包的文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/564168/