我使用Module::Metadata
从其位置获取Perl模块的名称,但它不适用于缺少包信息的某些模块(如DBIx::Class::Carp
,DateTimePP
)
use strict;
use warnings;
# Modules corresponding to Perl module information
use File::Find;
use Module::Metadata;
my @files = ();
find({
wanted => sub {
push @files, $File::Find::fullname
if (defined $File::Find::fullname
&& (-f $File::Find::fullname && /\.pm$/));
},
follow => 1,
follow_skip => 2,
},
@INC
);
my ($file_path, $module_name, $info) = ("", "", "");
my %modules = ();
foreach $file_path (@files) { # loop through all the perl module (.pms) found
$info = Module::Metadata->new_from_file($file_path);
$module_name = $info->name;
if (!$module_name) {
print $file_path . "\n";
}
$modules{$file_path} = $module_name;
}
答案 0 :(得分:0)
将(相对)perl模块路径转换为其包名称只需将/
替换为::
并剥离.pm
扩展名。
my $file_path = 'Foo/Bar.pm';
$file_path =~ s#/#::#g;
$file_path =~ s#\.pm##g;
print "$file_path\n";
打印:
Foo::Bar
编辑:
如果您有完全限定的文件路径,可以尝试这样的方法去除前缀(取决于模块的安装位置)并获取相对路径:
use Config;
my $site_lib = $Config{sitelib};
$file_path =~ s#^$site_lib/##;