这是5个特殊的代码块。要理解这几个块,关键在于几个时间点:
在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块是在程序执行结束,但退出前执行的,也就是上面的步骤(3)所在期间。
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 {
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
Perl的特殊代码块:BEGIN、CHECK、INIT、END和UNITCHECK
原文:https://www.cnblogs.com/f-ck-need-u/p/9780625.html