我一直在玩弄 modulino perl 模式,并且想在不知道包名称和只知道它所在的文件的情况下加载一个模式。我正在寻找可以像这样使用的东西:
eval {
my $file = "some-file-name-in-the-hierarchy-unrelated-to-package-name";
my $module = something($file);
$module->sub1();
};
这里的某物
是关键。没有 require
或 use
因为之后我需要模块名称。我是否必须读取 $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/