【问题标题】:How to have a config file automatically add 'global' modules for all pages如何让配置文件自动为所有页面添加“全局”模块
【发布时间】:2013-08-14 03:25:27
【问题描述】:

我正在使用 perl 和 apache 构建一个内部自动化/网络工具。它托管在 Windows 环境中。我的问题是在处理许多都有公共模块的页面时。除了手动为每个页面添加每个模块之外,是否可以将“全局模块”拉入页面可用的所有模块?

例如,如果我需要添加一个新模块并且有 10 个页面,而不是进入每个页面并添加使用 New::Package;是否可以在 1 个配置文件中执行此操作,这将使 New::Package 可用于使用此配置模块的每个文件?

我已经用 PHP 完成了这项工作,您可以在一些 init 脚本中包含/要求,然后在每个页面上简单地包含该 init 脚本。

Package MyProj::Configuration
use package1;
...
use package999;

# Main Page
use MyProj::Configuration;

# Now all modules are included in this page, without needing to add them manually

TLDR: 你可以让一个配置模块将多个模块/包导入只包含这个神奇配置模块的页面吗?

编辑:我想补充一点,我对 perl 还很陌生,所以如果这是显而易见的事情,那就放轻松:)

【问题讨论】:

    标签: windows perl apache


    【解决方案1】:

    这根本不是一件显而易见的事情。 Exporter 模块提供了一个export_to_level 函数可以帮助解决这个问题。通常,使用Exporter(即,使包成为Exporter 的子类)将符号导出到调用包中。 export_to_level 方法可以将符号导出到堆栈跟踪更高的包中,这就是您要在此处执行的操作。这是一个概念验证:

    首先是一些具有导出功能的模块:

    # Module1.pm
    package Module1;
    use base 'Exporter';
    our @EXPORT = ('foo');
    sub foo { "FOO" }
    1;
    
    # Module2.pm
    package Module2;
    use base 'Exporter';
    our @EXPORT_OK = ('bar');
    sub bar { "BAR" }
    1;
    
    # Module3.pm
    package Module3;
    use base 'Exporter';
    our @EXPORT_OK = ('baz');
    our %EXPORT_TAGS = ('all' => [ 'baz' ]);
    sub baz { "BAZ" }
    1;
    

    而不必说

    use Module1;
    use Module2 'bar';
    use Module3 ':all';
    use Module4;         # some other module that doesn't need to export anything
    

    在几十个脚本中的每一个中,你宁愿说

    use Module1234;
    

    这就是Module1234.pm 的样子:

    package Module1234; # optional
    use Module1;
    use Module2;
    use Module3;
    use Module4;
    
    # these commands could go inside an  import  method, too.
    Module1->export_to_level(1, __PACKAGE__);
    Module2->export_to_level(1, __PACKAGE__, 'bar');
    Module3->export_to_level(1, __PACKAGE__, ':all');
    1;
    

    正在调用

    package MyPackage;
    use Module1234;
    

    在您的脚本中将加载其他四个模块并处理将所有所需功能导出到MyPackage 包,并且

    use Module1234;
    print foo(), bar(), baz();
    

    足以产生输出"FOOBARBAZ"

    【讨论】:

    • 哦,完美!我会尽快试试这个。
    猜你喜欢
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多