如何检查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));

我有一些代码要求应用程序在执行之前完全加载和编译

有没有办法检查我的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();
和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!
}