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 のないモジュールを見つけることはできません。
まあ、perldoc はファイル名を教えてくれます:
[fayland@alpha ~]$ perldoc -l Catalyst
/home/fayland/perl5/lib/perl5/Catalyst.pm
または、モジュールをロードした後に %INC を調べます。
ありがとう。
ドー - 思い出した。
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;