我有一些代码需要在应用程序执行之前完全加载和编译应用程序。
有没有办法检查我的Perl程序是否仍处于编译阶段?
我有一些有用的东西,但必须有更好的方法:
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();
和subpkg.pm包含:
package subpkg;
use strict;
use warnings;
printf("initing subpkg\n");
main::check_compile();
1; # successfully loaded
答案 0 :(得分:6)
我认为你的代码没有充分利用eval
- 否则编译将与执行一起“混入” - 但你可能会审查INIT
和类似块{{}的使用3}}作为简化此事的可能方法。
INIT块就在之前运行 Perl运行时开始执行,在 “先进先出”(FIFO)令。
答案 1 :(得分:2)
请参阅$^S
in perlvar
:
翻译的当前状态。
$^S State --------- ------------------- undef Parsing module/eval true (1) Executing an eval false (0) Otherwise
第一个州可能发生在$ SIG { DIE }和$ SIG { WARN }处理程序中。
BEGIN { print "Compile $^S\n" } print "Run-time $^S\n"; eval { print "Eval $^S\n" };
Compile Run time 0 Eval 1
答案 2 :(得分:-1)
未经测试,但AFAIK应该这样做:
sub main_run_phase_entered {
local $@;
! eval q!use warnings FATAL => 'all'; CHECK{} 1!
}
更新:nope,在END {}块中失败(使用5.10.1)。 CHECK {}不会运行,但也不会抱怨。