【问题标题】:Perl: how to share the import of a large list of modules between many independent scripts?Perl:如何在许多独立脚本之间共享大量模块的导入?
【发布时间】:2011-02-08 14:58:12
【问题描述】:

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

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

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

  3. 我可以 require() 一个 sharedmodules.pl,它似乎也将所有内容都导入到 main:: 中。我不喜欢这种方法,因为 require() 在 mod_perl 下效果不佳。

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

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

【问题讨论】:

标签: perl module


【解决方案1】:

也许比将所有内容都放入main 命名空间更灵活的是导入调用者的命名空间。像这样的:

package SharedModules;

sub import {

    my $pkg = (caller())[0];
    eval <<"EOD";

package $pkg;

use List::Util;
use List::MoreUtils;

EOD

    die $@ if $@;
}

1;

【讨论】:

    【解决方案2】:

    您提出的所有三个解决方案的问题是该模块可能是来自另一个模块的used,在这种情况下,符号应该导出到useing 模块的包中,而不是导出到main

    bvr 使用caller 将内容直接导入该包的解决方案是朝着正确方向迈出的重要一步,但会阻止“真正的”包使用use ShareableModules qw( foo bar baz); 选择性地仅导入它实际需要的内容。

    不幸的是,保留选择性导入的能力将要求您从底层模块导入所有相关符号,然后从 ShareableModules 重新导出它们。您不能只将导入委托给每个底层模块的 import 方法(就像 Modern::Perl 所做的那样),因为如果要求该模块未导出的符号,import 就会死掉。不过,如果这不是问题,那么 Modern::Perl 的做法可能是最干净、最简单的选择。

    【讨论】:

      【解决方案3】:

      使用require 是最自然的方法。在 mod_perl 下,您可能需要在服务器启动期间修改 @INC

      【讨论】:

        【解决方案4】:

        也许你想要Toolkit

        【讨论】:

          【解决方案5】:

          文件导入.pl:

          require blah;  blah->import;
          require blubb; blubb->import;
          

          脚本:

          #!/usr/bin/perl
          do 'import.pl'
          ...
          

          帕特里克

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-16
            相关资源
            最近更新 更多