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 -lFayland が述べたようにうまく機能しますが、POD のないモジュールを見つけることはできません。

于 2009-02-19T08:13:16.023 に答える
3

まあ、perldoc はファイル名を教えてくれます:

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

または、モジュールをロードした後に %INC を調べます。

ありがとう。

于 2009-02-19T06:43:53.040 に答える
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 に答える