如何让配置文件自动为所有页面添加“全局”模块

时间:2013-08-12 17:48:46

标签: windows perl apache

我正在使用带有apache的perl构建内部自动化/ Web工具。它托管在Windows环境中。我的问题是在处理所有具有共同模块的许多页面时。而不是为每个页面手动添加每个模块,是否可以在所有可用于页面的模块中提取“全局模块”?

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

我已经使用PHP完成了这项工作,您可以在某些init脚本中包含/ require,然后在每个页面上包含该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很新,所以如果这是显而易见的事情,那就去吧:)

1 个答案:

答案 0 :(得分:4)

这根本不是一件明显的事情。 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"