【问题标题】:BEGIN,CHECK,INIT& END blocks in PerlPerl 中的 BEGIN、CHECK、INIT 和 END 块
【发布时间】:2016-06-09 10:30:36
【问题描述】:

据我了解 Perl 代码中的这些特殊功能,BEGIN 和 CHECK 块在编译阶段运行,而 INIT 和 END 块在实际执行阶段运行。

我可以理解在实际的 Perl 代码(Perl 库)中使用这些块,但是在模块中使用它们呢?这可能吗?

因为当我们使用use <Module-name> 时模块被编译,所以实际上 BEGIN 和 CHECK 块运行。但是 INIT 和 END 块将如何运行,因为我认为模块代码不是真正意义上的运行。我们只使用模块内部的某些功能。

【问题讨论】:

标签: perl


【解决方案1】:

Short   通过use 加载的包中的特殊代码块按照与main:: 中相同的方式和顺序进行处理和运行(或计划运行),因为@987654325 @ 本身就是一个 BEGIN 块。


可以在in perlmod 找到有关这方面的优秀文档。从这个部分

BEGIN 代码块会尽快执行,即在它被完全定义的那一刻,甚至在包含文件(或字符串)的其余部分被解析之前。

由于use 语句是 BEGIN 块,它们一遇到就会运行。来自use

完全等价于

BEGIN { require Module; Module->import( LIST ); }

所以包中的BEGIN 块在遇到时与其他块一起运行。然后包中的END 块以及其他特殊块也以相同的顺序编译。至于(最终)执行的顺序

END 代码块尽可能晚地执行 ...

和

您可能在一个文件中有多个 END 块——它们将按照定义的相反顺序执行;即:后进先出(LIFO)

INIT 和 CHECK 块的编译和执行顺序如下。


这里有一些代码来演示包中使用的这些特殊代码块。

文件 PackageBlocks.pm

package PackageBlocks;
use warnings;

BEGIN { print "BEGIN block in the package\n" }
INIT  { print "INIT  block in the package\n" }
END   { print "END   block in the package\n" }
1;

主脚本

use warnings;

BEGIN { print "BEGIN in main script.\n" }

print "Running in the main.\n";

INIT { print "INIT in main script.\n" }

use PackageBlocks;

END   { print "END in main script.\n" }
BEGIN { print "BEGIN in main script, after package is loaded.\n" }

print "After use PackageBlocks.\n";

输出

在主脚本中开始。 包中的 BEGIN 块 在加载包后,在主脚本中开始。 主脚本中的初始化。 包中的 INIT 块 跑为主。 使用 PackageBlocks 之后。 在主脚本中结束。 包中的 END 块

包中的BEGIN 块按出现顺序运行,与main:: 中的块相比,INIT 之前的块。 END 块在末尾运行, 并且包中的那个在main:: 中的那个之后运行,因为在这个例子中use 在它之前。

【讨论】:

  • 这并没有解决 OP 的问题,即 Perl 模块中的 INIT 和 END 块
  • @Borodin 哦......最后一段让我绊倒了,谢谢。我会补充的。
【解决方案2】:

这很容易自己测试

use Module(以及 require EXPR 和 do EXPR 和 eval EXPR)编译 Perl 代码,然后立即运行它

这就是大多数模块末尾的1; 被选中的地方。如果编译后执行模块的代码没有返回 true 值,那么require 将失败

诚然,INIT 或 END 块通常没有多大用处,因为运行时阶段与编译密切相关,而且模块通常与定义子例程有关,但选项是如果你想要的话就在那里

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    相关资源
    最近更新 更多