如何从Perl模块位置获取Perl包名称

时间:2014-08-13 18:58:12

标签: perl

下面的代码将找到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;
            }
        }
    }
}

1 个答案:

答案 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捆绑在一起。