如何强制卸载Perl模块?

时间:2009-08-03 12:42:20

标签: perl module

您好我使用的是另一个不再在公司的人写的perl脚本。 如果我将脚本作为独立运行,那么输出就像预期的那样。但是当我重复从另一个代码调用脚本时,输出错误,除了第一次。

我怀疑某些变量未正确初始化。当它被称为独立时,每次退出时,所有变量值都初始化为默认值。但是当从另一个perl脚本调用时,模块和变量值可能会转移到下一次调用脚本。
在下次调用之前,有没有办法从内存中清除被调用的脚本?

我尝试启用警告,并且它抛出了数千行警告......!

编辑:我如何调用其他脚本:

代码如下所示:

do "processing.pl";
...
...
...

process(params); #A function in processing.pl
...
...
...

6 个答案:

答案 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');。懒惰地,我们使用一些脚本来强制重新初始化许多类/变量等。并强制日志文件正确旋转。

编辑:我刚刚重新阅读了您的问题,看起来您并没有这样称呼它。