perl - 如何找出 Perl 包的文件名?

标签 perl packages cpan filenames

我想将 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/

相关文章:

project-management - 为什么使用 com.company.project 结构?

sql - 有没有办法命名 PL/SQL 包?

r - ShinyApps : "shinythemes" package not loading when deployed on Shinyapps. io

perl - 我可以重新测试所有已安装的 CPAN 模块吗?

perl - 如何在 Solaris 上为 Perl 编译 64 位 Postgres 绑定(bind)?

apache - autovivication.pm 中的 Perl cgi 编译错误

perl - 为什么我的 Perl CGI 会提示 "Premature end of script headers"?

mysql - 在 perl 5.10.0 MacOS 10.6.8 上安装 DBI

perl - 如何在 Perl 中通过 ssh 从 cat 获取输入

ruby - 最新的 ruby 在哪里 : Ruby gems equivalent of search. cpan.org/recent