这个问题需要对编译器阶段和BEGIN
块的理解。从Perl编程:第3版-第467页
了解编译阶段与编译时间之间以及运行阶段与运行时间之间的区别也很重要。典型的Perl程序会进入一个编译阶段,然后进入一个运行阶段。“阶段”是一个大规模的概念。但是编译时间和运行时间是小规模的概念。给定的编译阶段主要执行编译时工作,但是它也通过
BEGIN
块执行一些运行时工作。给定的运行阶段主要执行运行时工作,但是它可以通过诸如的运算符来执行编译时工作eval STRING
。
让我们举一个简单的例子
sub complex_sub {
die 'code run';
}
sleep 5;
print 'good';
use constant FOO => complex_sub();
如果上述内容按原样运行,complex_sub
则从用户角度来看,将在编译器阶段运行。但是,只要稍加修改,我就可以拥有。
# Bar.pm
package Bar {
use constant FOO => main::complex_sub();
}
# test.pl
package main {
sub complex_sub {
die 'code run';
}
sleep 5;
print 'good';
require Bar;
}
在上面的代码complex_sub
中,在执行阶段运行。无论如何,从complex_sub
启用顶部语法的角度来区分这两种情况,但禁止底部语法。
使用${^GLOBAL_PHASE}
变量。在第一种情况下,它包含“ START”,在第二种情况下,它包含“ RUN”。
# RUN
perl -wE'say ${^GLOBAL_PHASE}'
# START
perl -wE'BEGIN {say ${^GLOBAL_PHASE}}'
# RUN
perl -wE'eval q{BEGIN {say ${^GLOBAL_PHASE}}}'
有关详细信息,请参见perlvar。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句