perl - 在不知道模块名但知道文件名的情况下加载和使用perl模块

标签 perl modulino

我一直在玩弄 modulino perl 模式,并且想在不知道包名称和只知道它所在的文件的情况下加载一个模式。我正在寻找可以像这样使用的东西:

eval {
  my $file = "some-file-name-in-the-hierarchy-unrelated-to-package-name";
  my $module = something($file);
  $module->sub1();
};

这里的某物是关键。没有 requireuse 因为之后我需要模块名称。我是否必须读取 $file 并从中解析出 package 名称才能使用它?我确信可能有更好的方法。 Perl 中总是有的。

最佳答案

您控制哪些文件?如果您将程序创建为 modulino,然后尝试加载该文件,只需使文件中的最后一条语句返回包名称即可。 require期望您返回一个真值并且大多数模块使用1;。但是,您可以使用任何您喜欢的真实值。这将是 require 的返回值:

# i_dont_know_whats_inside
package Buster;

__PACKAGE__;

加载很容易:

my $package = require 'i_dont_know_whats_inside';

print "Package is $package\n";

$package->new( ... );

如果您无法控制正在加载的文件,那么找出里面的内容并不难:

my @packages = load_file( 'i_dont_know_whats_inside' );

print "Packages are @packages\n";

sub load_file {
    my $file = shift;
    require Module::Extract::Namespaces;
    my @packages = Module::Extract::Namespaces->from_file( $file );
    my $rc = require $file;
    return @packages;
    }

关于perl - 在不知道模块名但知道文件名的情况下加载和使用perl模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9847986/

相关文章:

python - 相当于 Perl Modulino for Ruby, Python?

raku - 如果需要该文件,Perl 6 是否应该运行 MAIN?

perl - 如何使用 mod_perl 在 CGI::Application 中拥有持久的 DBIx::Class?

perl - 使用 Perl 访问 50 万页

perl - 我应该如何比较 Perl 引用文献?

perl - 为什么 Perl 模数中断测试中的 'package' 关键字?

regex - Perl one liner corrupts file in Windows (carriage-return related issue)

postgresql - Perl DBIx::Class:从数据库获取当前时间

ruby - 如何在 ruby​​ 模块中包含单元测试?