Как проверить, завершена ли компиляция Perl? - PullRequest
4 голосов
/ 27 августа 2010

У меня есть некоторый код, который требует полной загрузки и компиляции приложения перед его выполнением.

Есть ли способ проверить, находится ли моя 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 ]

6 голосов
/ 27 августа 2010

Полагаю, в вашем коде мало используется eval - в противном случае компиляция будет происходить "в замешательстве" с выполнением - но вы можете рассмотреть использование INIT и подобных блоков здесь как возможный способ упростить это.

Блоки INIT запускаются непосредственно перед Perl Runtime начинает выполнение, в Порядок "первым пришел, первым вышел" (FIFO).

2 голосов
/ 27 августа 2010

См. $^S в 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 голосов
/ 27 августа 2010

Не проверено, но AFAIK должен это сделать:

sub main_run_phase_entered {
    local $@;
    ! eval q!use warnings FATAL => 'all'; CHECK{} 1!
}

Обновление: нет, сбой для меня (с 5.10.1) в блоке END {}. ПРОВЕРКА {} не запускается, но и не жалуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...