我有很多独立脚本。他们唯一共享的是,他们使用()一大组CPAN模块(每个模块都导出几个函数)。我想集中这个模块列表。我发现了几种方法。哪一个最好?
我可以创建SharedModules.pm来导入所有内容,然后使用Exporter手动将所有内容导出到main ::
我可以创建以“package main”开头的SharedModules.pm所以它会直接导入main ::。它似乎工作。这是不好的做法,为什么?
我可以要求()一个似乎将所有东西都导入main ::的sharedmodules.pl。我不喜欢这种方法,因为在mod_perl下,require()不能很好地工作。
第二个看起来对我来说最好,但是我想知道为什么例如Modern :: Perl不能那样工作。
编辑:我认为这个问题一直是asked before。
答案 0 :(得分:6)
将所有内容放入main
命名空间可能比导入调用者的命名空间更灵活。像这样:
package SharedModules;
sub import {
my $pkg = (caller())[0];
eval <<"EOD";
package $pkg;
use List::Util;
use List::MoreUtils;
EOD
die $@ if $@;
}
1;
答案 1 :(得分:4)
你提出的所有三个解决方案的问题在于模块可能是use
来自另一个模块,在这种情况下,符号应该导出到use
模块的包中,而不是{ {1}}。
bvr使用main
将内容直接导入到该包中的解决方案是朝着正确方向迈出的重要一步,但是阻止“真实”包使用caller
选择性地仅导入其实际需要的内容
不幸的是,保留选择性导入的能力将要求您从底层模块导入所有相关符号,然后从ShareableModules重新导出它们。您不能将导入委托给每个基础模块的use ShareableModules qw( foo bar baz);
方法(如import
那样),因为Modern::Perl
如果要求输出该模块未导出的符号则会死亡。如果这不是问题,那么import
的做法可能是最简洁和最简单的选择。
答案 2 :(得分:2)
使用require
是最自然的方法。在mod_perl下,您可能需要在服务器启动期间修改@INC
。
答案 3 :(得分:2)
也许你想要Toolkit。
答案 4 :(得分:1)
文件import.pl:
require blah; blah->import;
require blubb; blubb->import;
Skripts:
#!/usr/bin/perl
do 'import.pl'
...
帕特里克