不知道包意味着加载机制必须返回信息,因此我们需要使用do
.
usingdo
意味着我们不能使用符号表,这意味着匿名 subs。
创建一个如下所示的文件:
sub foo { ... }
sub bar { ... }
{
foo => \&foo,
bar => \&bar,
};
或喜欢
{
foo => sub { ... },
bar => sub { ... },
};
然后使用
my $table = do '/abs/path/to/file.pl' or die $@;
$table{foo}->();
或者
my $table = do 'rel/path/to/file.pl' or die $@; # Relative to entries in @INC
$table{foo}->();
您可以do
多次调用,但要避免调用,因为它每次都会编译和运行文件。而是缓存它返回的值。
丑陋!这一切都是因为您不希望文件名和其中的包之间有任何关系。如果你试图规避 Perl 的要求,那就是丑陋。有这个要求甚至对你没有任何帮助,所以摆脱它。
应该做的是创建一个如下所示的文件:
package Some::Package;
sub foo { shift; ... }
sub bar { shift; ... }
1;
调用代码将是:
my $file= 'Some/Package.pm';
my $pkg = $file;
$file =~ s{\.pm\z}{};
$file =~ s{/}{::}g;
require $file;
$pkg->foo();
另请参阅Module::PluginFinder。