我有很多独立的脚本.他们唯一共享的是,他们使用()一大组CPAN模块(每个模块都导出几个函数).我想集中这个模块列表.我发现了几种方法.哪一个是最好的?
我可以创建SharedModules.pm来导入所有内容,然后使用Exporter手动将所有内容导出到main ::.
我可以创建以"package main"开头的SharedModules.pm 所以它会直接导入main ::.它似乎工作.这是不好的做法,为什么?
我可以要求()一个似乎将所有内容导入main ::的sharedmodules.pl.我不喜欢这种方法,因为在mod_perl下,require()不能很好地工作.
第二个看起来对我来说最好,但是我想知道为什么例如Modern :: Perl不能那样工作.
将所有内容放入main命名空间可能比将其导入调用者的命名空间更灵活.像这样的东西:
package SharedModules;
sub import {
my $pkg = (caller())[0];
eval <<"EOD";
package $pkg;
use List::Util;
use List::MoreUtils;
EOD
die $@ if $@;
}
1;
Run Code Online (Sandbox Code Playgroud)
您提出的所有三个解决方案的问题在于该模块可能是use从另一个模块中导出的,在这种情况下,符号应该导出到useing 模块的包中,而不是导出到main.
bvr 的解决方案是使用caller将内容直接导入到该包中,这是朝着正确方向迈出的重要一步,但阻止了“真实”包使用use ShareableModules qw( foo bar baz);选择性地仅导入其实际需要的内容。
不幸的是,保留选择性导入的能力将要求您从底层模块导入所有相关符号,然后从 ShareableModules 重新导出它们。您不能将导入委托给每个底层模块的import方法(就像这样Modern::Perl做),因为import如果要求提供该模块未导出的符号,则会死亡。不过,如果这不是问题,那么 的Modern::Perl做法可能是最干净、最简单的选择。