6

我想将 Perl 包名称转换为文件的完整路径。

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

我知道有一个 CPAN 模块可以做到这一点?就是找不到了?

4

3 回答 3

10

如果您已经加载了模块,只需查看 %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 的模块。

于 2009-02-19T08:13:16.023 回答
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;
于 2009-02-19T06:30:24.617 回答
3

好吧,perldoc 可以告诉你文件名:

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

或在加载模块后查看 %INC。

谢谢。

于 2009-02-19T06:43:53.040 回答