【问题标题】:How can I get Perl Package name from Perl Module Location如何从 Perl 模块位置获取 Perl 包名称
【发布时间】:2014-08-13 18:58:11
【问题描述】:

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

【问题讨论】:

    标签: perl


    【解决方案1】:

    如果它是一个已经通过标准use 语句加载的模块,那么最好的方法可能是执行以下操作:

    my %CNI = reverse %INC;
    my $module = $CNI{$filename};
    $module =~ s{[.]pmc?$}{};
    $module =~ s{/}{::}g;
    

    在一般情况下,尝试Module::Metadata - 这会扫描模块的源代码并在其中找到package 语句。从 Perl 5.14 开始,Module::Metadata 就与 Perl 捆绑在一起。

    【讨论】:

    • 对于像 DBIx::Class::Carp 这样的包,Module::Metadata 不会打印包信息,因为模块中缺少包信息。无论如何,我也可以为他们获取包名称吗?
    • 最终你只需要接受模块和包之间没有一一对应的关系,没有完美的解决方案。一个模块可以定义一个包,或者多个包,或者没有包。相反,包定义可以拆分为多个模块,所有模块都需要加载才能使包被视为“完整”。
    猜你喜欢
    • 2014-10-06
    • 2014-10-07
    • 2010-10-21
    • 2010-12-27
    • 1970-01-01
    • 2016-12-13
    • 2010-10-14
    • 2010-12-06
    相关资源
    最近更新 更多