如何从模块文件的路径获取Perl包名称

时间:2014-08-13 21:00:43

标签: perl

我使用Module::Metadata从其位置获取Perl模块的名称,但它不适用于缺少包信息的某些模块(如DBIx::Class::CarpDateTimePP

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;
}

1 个答案:

答案 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/##;