如何强制卸载Perl模块?

Man*_*noj 9 perl module

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

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

我尝试启用警告,它抛出了1000行警告......!

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

代码如下所示:

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

process(params); #A function in processing.pl
...
...
...
Run Code Online (Sandbox Code Playgroud)

fri*_*edo 11

如果要强制重新加载模块,请从中删除其条目%INC,然后重新加载.

例如:

sub reload_module { 
    delete $INC{'Your/Silly/Module.pm'};
    require Your::Silly::Module;
    Your::Silly::Module->import;
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果此模块依赖于正在设置的其他模块中的全局变量,则可能还需要重新加载这些模块.没有在代码中达到高峰就没有简单的方法可以知道.

  • Module :: Reload将为您处理这些细节,但也请注意我的评论tsee的答案. (2认同)

Eth*_*her 8

嗨我正在使用另一个不再在公司的人写的perl脚本.我尝试启用警告,它抛出了1000行警告......!

那里有你的问题.脚本编写不正确,应该重写.

问自己这个问题:当你启用严格检查时,如果它有1000个警告,你怎么能确定它正在做正确的事情?你如何确定它不是破坏文件,破坏数据集,弄乱你的文件系统?有可能是故意或偶然地做所有这些事情.

我不相信运行由不再与公司合作的人编写的错误填写的脚本.我会重写它,并确保它正在做我需要它做的事情.

  • 我推断一个应该优先重写的草率代码库:)但同意,没有警告并不表示没有错误. (2认同)

tse*_*see 5

卸载模块比简单地删除模块的%INC条目更困难.看看CPAN 中的Class :: Unload.

  • 请注意,Class :: Unload不是此问题的直接解决方案.它的目标是清理特定包装内的任何东西.它不会撤消模块可能已经完成的任何其他操作,例如弄乱Perl特殊变量,在其他类中定义任何东西(我经常做的事情),或者模块可能做的任何其他不涉及符号的事情表. (7认同)

Dav*_*ogt 4

如果您不想重写/修复脚本,我建议通过exec()或其变体之一调用脚本。虽然这样做不是很优雅,但它肯定会解决你的问题。

  • 使用“exec”的问题是您无法调用函数“process”,因为它尚未加载到程序中。因此,您必须担心如何以 Perl 可以管理的格式从 exec'd 程序中获取信息。我想某种生成字符串的格式化输出可能会起作用,在评估时初始化变量可能会起作用 - 但继续清理或重写代码可能会更简单。 (2认同)