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 在它之前。