我有一个 Perl 模块的循环依赖问题:说包 X
使用 Y
并且想持有对 Y
实例的静态引用,包 Y
使用 X
并希望持有对 X
实例的静态引用。
简单地说 our $x_instance = new X
将给出 Can't locate object method "new" in the module that was not loaded first.
我想到了类似的东西
our $x_instance;
INIT { $x_instance = new X }
很有道理,所以我读了everything about the specially named blocks.
好吧,这在我做的一个简单测试中有效,但在我的实际应用程序中它系统地显示运行 INIT block 太晚了。 CHECK
block 也会发生同样的情况。
我找到的唯一解释来自 Perl Monks恐怕我无法理解它。
是否有人解释了 Perl 如何执行 CHECK
和 INIT
block ,这超出了 perlmod
中的内容,并且会有所帮助我明白为什么我的 block 有时执行有时不执行吗?
顺便说一句,我只是想了解这一点——我并不是特别要求解决我最初的循环依赖问题,因为我有一个我相当满意的解决方法:
our $x_instance;
sub get_x_instance {
$x_instance //= new X;
return $x_instance;
}
最佳答案
INIT
block 在运行时阶段开始之前立即按照编译器在编译阶段遇到它们的顺序执行。
如果您在运行时使用 require
(或 do
)来编译包含 INIT
block 的 Perl 文件,那么该 block 将获胜'被执行。
很少有真正的理由使用 require
而不是 use
。
尽管您很自信,但必须有一个地方是您尝试在运行时加载包含 INIT
block 的模块的地方。我建议你安装和使用 Carp::Always
因此 Too late to run INIT block
消息伴随着堆栈回溯,这将帮助您找到错误的调用。
关于perl - CHECK 和 INIT block 怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23733805/