2014-01-17 3 views
1

Я понимаю, что BEGIN выполняется перед основной программой. На вопросы:Блоки BEGIN Perl в app.psgi

  • что основная программа, когда речь идет о применении PGSI - или лучше
  • , когда будет выполняться НАЧАТЬ блок в приложении PGSI?
  • Это другое для plackup или Starman и как?
  • Что относительно посредников - когда есть Несколько BEGIN блоки?

Пример app.psgi:

use Modern::Perl; 
use YAML; 
use Plack::Builder; 
use CGI::Emulate::PSGI; 

our($cfg); 

BEGIN { 
    $cfg = YAML::LoadFile("my.config"); 
} 

#old really __BIG__ cgi application - what uses many BEGIN blocks too... 
my $app1 = CGI::Emulate::PSGI->handler(sub { 
    use My::CgiApp1; 
    My::CgiApp1::executer->run(); 
}); 
my $app2 = sub { ... }; 

builder { 
    mount "/path1" => $app1; 
    mount "/"  => $app2; 
} 

В каком порядке будет выполнено Кратные BEGIN блоков, что определены в My::CgiApp1 и моя app.pgsi?

С точкой вышеуказанного заявления PSGI зрения, что основное различие с помощью:

BEGIN { 
    $cfg = YAML::LoadFile("my.config"); 
} 

или простого

$cfg = YAML::LoadFile("my.config"); 

ответ

4

BEGIN блоков выполняются во время компиляции фазы немедленно конец блок рассматривается компилятором.

Это означает, что каждый блок BEGIN выполнен только , как только, перед запуском основного запуска, и блоки выполняются в том порядке, в котором их видит компилятор.

Помните, что use заявления по существу в скрытом BEGIN блоке require, так что в вашем случае компилятор будет обрабатывать основную программу, выполнение YAML::LoadFile как только закрывающая скобка его BEGIN блока видна. Затем он продолжит компиляцию программы до use My::CgiApp1, когда она приостановит обработку основной программы и начнет компилировать My/CgiApp1.pm.

Теперь Perl выполнит любые BEGIN блоки, которые он находит в этом файле, как они встречаются, и аналогичным образом приостановить обработку в случае любых дальнейших операторов use.

Как только модуль, указанный в любом заявлении use, завершил компиляцию, обработка будет продолжена в исходном файле со следующей строкой кода.

Все это происходит до выполнения My::CgiApp1::executer->run, который является обычным оператором и поэтому выполняется во время выполнения.

Смежные вопросы