首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl在app.psgi中的BEGIN块

Perl在app.psgi中的BEGIN块
EN

Stack Overflow用户
提问于 2014-01-17 11:45:03
回答 1查看 116关注 0票数 1

我知道BEGIN是在主程序之前执行的。问题如下:

  • 谈论PGSI应用程序时,主要程序是什么?或者更好。
  • 什么时候在PGSI应用程序中执行BEGIN块?
  • 这对plackupStarman来说是不同的吗?
  • 那么中间件呢--什么时候多个开始块?

示例app.psgi

代码语言:javascript
复制
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应用程序的角度来看,使用以下方法的主要区别是:

代码语言:javascript
复制
BEGIN {
    $cfg = YAML::LoadFile("my.config");
}

或者一个简单的

代码语言:javascript
复制
$cfg = YAML::LoadFile("my.config");
EN

回答 1

Stack Overflow用户

发布于 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之前,这是一个普通的语句,因此在运行时执行。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21185172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档