如何将长Perl脚本拆分为两个或多个可以访问相同变量的不同文件,而无需重命名所有共享变量。 $count
到$::count
(或$main::count
哪个相同)?
换句话说,什么是将Perl脚本拆分成多个文件而不必导入大量变量/函数和/或进行大量手动编辑的最佳和最简单的方法。
我认为它与使代码成为相同包/范围/命名空间的一部分有关,但到目前为止我的实验都失败了。
我不确定它是否有所作为,但该脚本用于web / CGI目的,并将在mod_perl下运行。
编辑 - 背景:
我知道我会得到那种回应。我想拆分文件的原因如下:
目前我有一个非常古老且非常长的Perl文件。我知道它不遵循Perl最佳实践,但它有效。
问题是,我需要在不同的Web服务器之间分发它使用的数据文件,首先是出于性能原因。将有一个“主”服务器和一个或几个“奴隶”。
大约20%的提到的Perl文件包含共享功能,40%的代码需要在主服务器上运行,40%在从服务器上运行。因此,我想将代码分成三个文件:1。共享,2。仅限master,3。仅奴隶。在主服务器上,将加载1和2,在从站上将加载1和3。
我认为这种方法会使用更少的进程RAM,更重要的是,我会尽量减少不正确拆分代码的风险(例如,一个从属进程调用一个主数据文件)。我不认为对模块化有很大的需求,因为系统可以工作,而且代码不需要与其他项目进行大量的更改或交换。
编辑2 - 解决方案:
找到我在这里寻找的解决方案: http://www.perlmonks.org/?node_id=95813
如果主包是变量的所有权,那么 实际的单词'main'可以省略,产生类似:$ :: var
可以绕过必须完全限定变量名称 当严格使用时。使用简单地使用vars到您的脚本 变量名称作为参数将绕过显式包 名。
实际上,我最后重复了所需变量的our ($count, etc...)
语句,而不是use vars ();
如果我错过了一些重要的事情,请告诉我 - 除了不使用模块! :)
@Axeman,谢谢,我会接受你的回答,无论是为了你的努力还是让我朝着正确的方向前进。
答案 0 :(得分:5)
除非您在其文件中添加不同的包语句,否则它们将被视为顶部有package main;
。因此,假设脚本使用包变量,您不必执行任何操作。如果已使用my
声明它们(也就是说,如果它们是词法范围的变量),那么您必须确保对变量的所有引用都在同一个文件中。
但是将脚本拆分为长度是烂替代模块化。是的,模块化有助于保持代码长度,但模块化如果保持代码长度的正确方法 - 由于所有原因,您希望保持代码长度下降,模块化最好。
如果按长度砍掉文件可能真的适合你,那么你可以创建一个这样的脚本:
do '/path/to/bin/part1.pl';
do '/path/to/bin/part2.pl';
do '/path/to/bin/part3.pl';
...
但我有点怀疑,如果这个代码的组织和你一样糟糕 - 有点 - 表明,它可能会受到一些同样重新发明我在Perl中看到的轮子的影响 - 签名脚本。只是随便(我可能是错的)但我想你会惊讶的是,通过简单地替换比for
更好测试的Perl库惯用语 - 循环和while
- 可以从长度上砍掉多少一切。