BEGIN

[BEGIN](http://perldoc.perl.org/functions/BEGIN.html)块在perl解释完这个代码块以后就立即被执行,甚至在文件剩下的部分被解释之前,而这个代码块在运行时则被忽略:

  1. use strict;
  2. use warnings;
  3. print "This gets printed second";
  4. BEGIN {
  5. print "This gets printed first";
  6. }
  7. print "This gets printed third";

BEGIN块总是首先执行。如果你创建了多个BEGIN块(别这么做),它们将按照解释器解释它们的顺序自上而下执行。BEGIN即使出现在脚本中间(别这么做)或者脚本最后(也别这么做),它也会首先被执行。不要搞乱自然的代码执行顺序,总是把BEGIN块放在开头!

BEGIN块在解释完后立即被执行,执行完毕以后将从这个BEGIN块结束处继续解释剩下的代码。如果BEGIN块以外的任何代码被执行了,那么整个脚本或者模块就已经被解释了一遍,且仅有一遍。

  1. use strict;
  2. use warnings;
  3. print "This 'print' statement gets parsed successfully but never executed";
  4. BEGIN {
  5. print "This gets printed first";
  6. }
  7. print "This, also, is parsed successfully but never executed";
  8. ...because e4h8v3oitv8h4o8gch3o84c3 there is a huge parsing error down here.

(译者注:上面程序的最后一行不是注释,作者写最后一行是构造一个语法错误,因而造成BEGIN块在解释到这里之前就已经被执行,而BEGIN块执行完毕以后继续恢复解释,一旦遇上语法错误,脚本其他部分将不会再被执行。)

因为它们在脚本编译时就执行,BEGIN块即使在条件分支中也仍然会在编译时就运行,哪怕条件将被判定为false,因为在那时条件还根本没有被求值,甚至可能永远不会被求值

  1. if(0) {
  2. BEGIN {
  3. print "This will definitely get printed";
  4. }
  5. print "Even though this won't";
  6. }

不要把BEGIN块放在条件分支里!如果你要在编译时做一些条件判断,把这个条件判断放在BEGIN里面

  1. BEGIN {
  2. if($condition) {
  3. # etc.
  4. }
  5. }