我知道BEGIN是在主程序之前执行的。问题如下:
plackup或Starman来说是不同的吗?示例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");发布于 2014-01-17 12:05:10
BEGIN块在编译阶段立即执行,编译器会看到块的末尾。
这意味着在主运行开始之前,每个BEGIN块只执行一次,并且按照编译器看到的顺序执行这些块。
请记住,use语句本质上是隐藏BEGIN块中的require,因此在您的示例中,编译器将处理主程序,在看到YAML::LoadFile块的结束大括号后立即执行YAML::LoadFile。然后,它将继续编译程序,直到use My::CgiApp1,当它将暂停处理主程序,并开始编译My/CgiApp1.pm。
Perl现在将执行它在此文件中遇到的任何BEGIN块,并在任何进一步的use语句中类似地挂起处理。
在任何use语句中指定的模块完成编译后,将在原始文件中继续处理下一行代码。
所有这些都发生在执行My::CgiApp1::executer->run之前,这是一个普通的语句,因此在运行时执行。
https://stackoverflow.com/questions/21185172
复制相似问题