这是5个特殊的代码块。要理解这几个块,关键在于几个时间点:

* (1).程序编译期间

* (2).程序执行期间

* (3).程序执行结束但还未退出期间
BEGIN块

* BEGIN块是在程序编译期间执行的,也就是上面的步骤(1)所在期间

* 即使程序中出现了语法错误,BEGIN块也会执行

* 如果出现了多个BEGIN块,则按照FIFO(first in first out)的方式输出,也就是从上到下的顺序
在BEGIN期间可以做一些程序执行之前的操作,例如事先给某个比较特殊的变量赋值,检查文件是否存在,检查操作系统是否满足要求等等。
package Foo; use strict; use warnings; BEGIN { print "This is the first BEGIN
block\n"; } print "The program is running\n"; BEGIN { print "This is the second
BEGIN block\n"; }
由于BEGIN代码块在编译期间执行,程序普通行的print是在执行期间执行,所以上面的代码结果为:
This is the first BEGIN block This is the second BEGIN block The program is
running
下面程序出现语法错误,但BEGIN也会执行:
BEGIN { print "This is the first BEGIN block\n"; } print "The program is
running\n"; BEGIN { print "This is the second BEGIN block\n"; } my $x =;
执行结果:
syntax error at some_program.pl line 8, near "=;" Execution of some_program.pl
aborted due to compilation errors. This is the first BEGIN block This is the
second BEGIN block
不过上面的error信息不一定会最先输出,因为stdout和stderr是两个独立的文件句柄,无法保证它们之间的顺序。

实际上,use导入模块时如果导入的是空列表,它等价于在BEGIN中使用require语句:
use File::Find (); # 等价于 BEGIN { require File::Find; }
END块

END块是在程序执行结束,但退出前执行的,也就是上面的步骤(3)所在期间。

* 当触发了die的时候,它们也会执行

* 但可以通过信号来忽略END

* 它们的执行顺序是LIFO(last in first out),即从下往上输出

* END常用来做清理、善后操作 END { print "This is the first END block\n"; } END { print
"This is the second END block\n"; }
输出结果:注意,先输出second END,再输出first END
This is the second END block This is the first END block
INIT、CHECK 和 UNITCHECK 块

INIT、CHECK 和 UNITCHECK 块生效于程序编译结束之后、执行之前。所以如果语法错误,它们不会被触发。

* CHECK在编译结束后立即执行,即上面步骤(1)刚完成之后,输出格式为LIFO

* INIT紧跟在CHECK之后,也是在步骤(2)之前,输出格式为FIFO

* UNITCHECK是在perl
5.9.5之后引入的功能。用于解决执行期间require或do或eval导入文件时不触发CHECK和INIT的问题(因为这些语句的导入是在执行期间进行的,而这两个块是在编译期间进行的)。UNITCHECK是在导入的文件刚编译完成之后、执行之前立即执行的
INIT { print "This is the first INIT block\n"; } CHECK { print "This is the
first CHECK block\n"; } INIT { print "This is the second INIT block\n"; } CHECK
{ print "This is the second CHECK block\n"; }
输出结果:
This is the second CHECK block This is the first CHECK block This is the first
INIT block This is the second INIT block

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信