Perl:如何在许多独立脚本之间共享大量模块的导入?

时间:2011-02-07 09:19:56

标签: perl module

我有很多独立脚本。他们唯一共享的是,他们使用()一大组CPAN模块(每个模块都导出几个函数)。我想集中这个模块列表。我发现了几种方法。哪一个最好?

  1. 我可以创建SharedModules.pm来导入所有内容,然后使用Exporter手动将所有内容导出到main ::

  2. 我可以创建以“package main”开头的SharedModules.pm所以它会直接导入main ::。它似乎工作。这是不好的做法,为什么?

  3. 我可以要求()一个似乎将所有东西都导入main ::的sharedmodules.pl。我不喜欢这种方法,因为在mod_perl下,require()不能很好地工作。

  4. 第二个看起来对我来说最好,但是我想知道为什么例如Modern :: Perl不能那样工作。

    编辑:我认为这个问题一直是asked before

5 个答案:

答案 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'
...

帕特里克