我有一个名为mypackage.pm的perl软件包(我在磁盘上)
我有一个名为test.pl的脚本
在我的test.pl中,我有以下声明
use mypackage;
现在,为什么在我的程序包内部进行更改时,运行test.pl脚本时这些更改没有反映出来?
答案 0 :(得分:2)
否。
启动Perl程序时,perl编译器将从磁盘读取该程序中引用的所有模块,对其进行编译并将结果操作码存储在内存中。它还会记住它已经读取了哪些文件(在%INC
中),因此不会再次读取它们。
读取这些文件的时间与 有所不同,但是在这里它们可能并不重要。如果您use
一个模块,则它将在编译时加载,就像程序启动时一样。如果您require
一个模块,则该模块可以位于条件语句中,并且在运行时执行该代码时将读取文件。可能是在程序启动时,或者是稍后启动,甚至从未启动。然后,Perl切换回该文件的编译时进行编译,然后返回运行时。
如果您想重新读取所使用的模块,通常必须重新启动程序。
话虽如此,有些黑魔法实现使您可以重新加载磁盘上已更改的模块。除非您要构建一个具有疯狂启动时间和高吞吐量的守护程序,否则可能不需要使用它。
这些模块之一是Module::Reload。它已经存在了一段时间,最近又发生了一些变化。其“另请参见”部分指向进一步的实现,即Module::Reload::Selective和again编译指示。
我都没有用过,也不能说它们是否有效或如何工作。