BEGIN
块
[BEGIN](http://perldoc.perl.org/functions/BEGIN.html)
块在perl
解释完这个代码块以后就立即被执行,甚至在文件剩下的部分被解释之前,而这个代码块在运行时则被忽略:
use strict;
use warnings;
print "This gets printed second";
BEGIN {
print "This gets printed first";
}
print "This gets printed third";
BEGIN
块总是首先执行。如果你创建了多个BEGIN
块(别这么做),它们将按照解释器解释它们的顺序自上而下执行。BEGIN
即使出现在脚本中间(别这么做)或者脚本最后(也别这么做),它也会首先被执行。不要搞乱自然的代码执行顺序,总是把BEGIN
块放在开头!
BEGIN
块在解释完后立即被执行,执行完毕以后将从这个BEGIN
块结束处继续解释剩下的代码。如果BEGIN
块以外的任何代码被执行了,那么整个脚本或者模块就已经被解释了一遍,且仅有一遍。
use strict;
use warnings;
print "This 'print' statement gets parsed successfully but never executed";
BEGIN {
print "This gets printed first";
}
print "This, also, is parsed successfully but never executed";
...because e4h8v3oitv8h4o8gch3o84c3 there is a huge parsing error down here.
(译者注:上面程序的最后一行不是注释,作者写最后一行是构造一个语法错误,因而造成BEGIN块在解释到这里之前就已经被执行,而BEGIN块执行完毕以后继续恢复解释,一旦遇上语法错误,脚本其他部分将不会再被执行。)
因为它们在脚本编译时就执行,BEGIN
块即使在条件分支中也仍然会在编译时就运行,哪怕条件将被判定为false,因为在那时条件还根本没有被求值,甚至可能永远不会被求值。
if(0) {
BEGIN {
print "This will definitely get printed";
}
print "Even though this won't";
}
不要把BEGIN
块放在条件分支里!如果你要在编译时做一些条件判断,把这个条件判断放在BEGIN
块里面:
BEGIN {
if($condition) {
# etc.
}
}
当前内容版权归 胡瀚森(Sam Hu)译 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 胡瀚森(Sam Hu)译 .