您好我使用的是另一个不再在公司的人写的perl脚本。 如果我将脚本作为独立运行,那么输出就像预期的那样。但是当我重复从另一个代码调用脚本时,输出错误,除了第一次。
我怀疑某些变量未正确初始化。当它被称为独立时,每次退出时,所有变量值都初始化为默认值。但是当从另一个perl脚本调用时,模块和变量值可能会转移到下一次调用脚本。
在下次调用之前,有没有办法从内存中清除被调用的脚本?
我尝试启用警告,并且它抛出了数千行警告......!
编辑:我如何调用其他脚本:
代码如下所示:
do "processing.pl";
...
...
...
process(params); #A function in processing.pl
...
...
...
答案 0 :(得分:11)
如果要强制重新加载模块,请从%INC
删除其条目,然后重新加载。
例如:
sub reload_module {
delete $INC{'Your/Silly/Module.pm'};
require Your::Silly::Module;
Your::Silly::Module->import;
}
请注意,如果此模块依赖于正在设置的其他模块中的全局变量,则可能还需要重新加载这些模块。没有在代码中达到高峰就没有简单的方法可以知道。
答案 1 :(得分:8)
您好我使用的是另一个不再在公司的人写的perl脚本。 我尝试启用警告,并且它抛出了数千行警告......!
那里有你的问题。脚本编写不正确,应该重写。
问自己这个问题:当你启用严格检查时,如果它有1000个警告,你怎么能确定它正在做正确的事情?你如何确定它不是破坏文件,破坏数据集,弄乱你的文件系统?有可能是故意或偶然地做所有这些事情。
我不相信运行由不再与公司合作的人编写的错误填写的脚本。我会重写它,并确保它正在做我需要它做的事情。
答案 2 :(得分:5)
卸载模块比简单地删除模块的%INC条目更困难。从CPAN看一下Class::Unload。
答案 3 :(得分:4)
如果您不想重写/修复脚本,我建议您通过exec()
或其中一种来调用脚本。虽然它不是很优雅,但它肯定会解决你的问题。
答案 4 :(得分:3)
您确定需要重新加载模块吗?通过使用do
,您每次都在阅读源并执行它。如果您将其更改为require
,只会读取和评估一次来源会发生什么?
答案 5 :(得分:0)
另一种可能性(只是在这里大声思考)可能与本地目录有关吗?他们是从同一个地方跑。可能第一次不会工作。
另一种选择是使用system ('doprocessing.pl');
。懒惰地,我们使用一些脚本来强制重新初始化许多类/变量等。并强制日志文件正确旋转。
编辑:我刚刚重新阅读了您的问题,看起来您并没有这样称呼它。