下面的代码将找到Perl模块的路径并将其存储在@files数组中。 我尝试了从perl模块路径中删除@INC路径的正则表达式,但它没有工作。 请告诉我从模块路径获取Perl模块名称的更好方法。
#Get locally installed Perl module path
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);
# Make the hash with Perl Module Path and Perl Module Name
my ($file_path, $name) = ("", "");
my %modules = ();
foreach $file_path (@files) { #loop through all the perl module (.pms) found
for (@INC) {#replace the path with scope resolution operator
if ($_ !~ /^\.$/) {
if ($file_path =~ /$_/) {
($name = $file_path) =~ s/$_//g;
$name =~ s/\//::/g;
$name =~ s/\.pm$//g;
$modules{$file_path} = $name;
}
}
}
}
答案 0 :(得分:2)
如果它是已经通过标准use
语句加载的模块,那么最好的方法可能是执行以下操作:
my %CNI = reverse %INC;
my $module = $CNI{$filename};
$module =~ s{[.]pmc?$}{};
$module =~ s{/}{::}g;
在一般情况下,请尝试Module::Metadata - 这会扫描模块的源代码并在其中查找package
语句。自Perl 5.14以来,Module :: Metadata已与Perl捆绑在一起。