2010-08-26 59 views
4

我有一些代码需要应用程序完全加载和编译,然后才能执行。如何检查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 
+0

为什么不在编译完成后简单地设置全局标志,并检查该标志的值? – Ether 2010-08-26 23:32:29

回答

6

我假设你的代码并没有太大的利用eval - 否则编译将与执行“混合” - 但您可以查看使用INIT和类似块here作为简化此操作的可能方法。

INIT块被运行 Perl的运行开始之前执行,在 “先入先出”(FIFO)顺序。

+0

当然。现在你提到它,这似乎很明显。看起来像Perl'd有一个状态变量反映了这一点。 – mmccoo 2010-08-26 23:37:36

+0

'eval'不是将编译混合到运行时的唯一方法。 'require'和'do'也会在正常执行过程中提取新代码并进行编译。 – 2010-08-27 05:32:10

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 
+0

编译时'eval's(也就是'BEGIN'块中的'eval')也没有定义'$^S' – mob 2010-08-26 23:20:11

+0

我没有在我的问题中使用过的其他软件包是' d。初始化代码在$^S为真时发生。那时候,还有更多的编译需要完成。 – mmccoo 2010-08-26 23:27:24

-1

未经检验的,但据我所知应该这样做:

sub main_run_phase_entered { 
    local [email protected]; 
    ! eval q!use warnings FATAL => 'all'; CHECK{} 1! 
} 

更新:不,在END {}块失败,我(与5.10.1)。 CHECK {}不运行,但也不会抱怨。

相关问题