如何检查Perl编译是否已经完成?
我有一些代码要求应用程序在执行之前完全加载和编译 有没有办法检查我的Perl程序是否仍处于编译阶段 我有一些有效的方法,但一定有更好的方法:如何检查Perl编译是否已经完成?,perl,Perl,我有一些代码要求应用程序在执行之前完全加载和编译 有没有办法检查我的Perl程序是否仍处于编译阶段 我有一些有效的方法,但一定有更好的方法: sub check_compile { printf("checking\n"); foreach my $depth (0..10) { my ($package, $filename, $line, $subroutine) = caller($depth); last unless (defined($package));
sub check_compile {
printf("checking\n");
foreach my $depth (0..10) {
my ($package, $filename, $line, $subroutine) = caller($depth);
last unless (defined($package));
printf(" %s %s %s %s %s\n", $depth, $package, $filename, $line, $subroutine);
if ($subroutine =~ /::BEGIN$/) {
printf("in compile\n");
return 1;
}
}
printf("not in compile\n");
return 0;
}
BEGIN {
check_compile();
}
use subpkg;
check_compile();
和kg.pm包含:
package subpkg;
use strict;
use warnings;
printf("initing subpkg\n");
main::check_compile();
1; # successfully loaded
我假设您的代码没有太多地使用
eval
——否则编译将与执行“混合”进行——但您可以查看INIT
和类似块的使用,作为简化此过程的可能方法
INIT块正好在
Perl运行时在中开始执行
“先进先出”(FIFO)顺序
见:
解释器的当前状态
$^S状态
--------- -------------------
未定义解析模块/eval
true(1)执行评估
否则为false(0)
第一个状态可能发生在$SIG{DIE}和$SIG{WARN}处理程序中
开始{打印“编译$^S\n”}
打印“运行时$^S\n”;
eval{打印“eval$^S\n”};
编撰 运行时0 评估1
未经测试,但AFAIK应该这样做:
sub main_run_phase_entered {
local $@;
! eval q!use warnings FATAL => 'all'; CHECK{} 1!
}
更新:不,在结束{}块中,我(使用5.10.1)失败。检查{}没有运行,但也没有抱怨。
$^S
对于编译时eval
S也没有定义(比如,在BEGIN
块中的eval
)。当$^S为true时,将发生初始化代码。在这一点上,还有更多的编译要做。为什么不在编译完成后简单地设置一个全局标志,并检查该标志的值呢?当然。既然你提到了这一点,它似乎是显而易见的。Perl似乎仍然有一个反映这一点的状态变量。eval
不是将编译混合到运行时的唯一方法require
和do
也将引入新代码,并在正常执行期间编译它。
BEGIN { print "Compile $^S\n" }
print "Run-time $^S\n";
eval { print "Eval $^S\n" };
Compile
Run time 0
Eval 1
sub main_run_phase_entered {
local $@;
! eval q!use warnings FATAL => 'all'; CHECK{} 1!
}