如何检查Perl编译是否已经完成?

时间:2010-08-26 22:59:15

标签: perl

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

有没有办法检查我的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

3 个答案:

答案 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 {}不会运行,但也不会抱怨。