IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Plack 代码和结构分析-Plack::Builder[译]

扶凯 2015-02-26 22:20:27 累计浏览 1,900 次
本机暂存

Plack::Builder 为中间件的开发提供了特定领域语言 domain specific language (DSL) 的风格. 它看起来就象:

usePlack::Builder;
  
my$app1= sub{ ... };
my$app2= sub{ ... };
  
builder {
    enable "Deflater";
    enable "Session", store => "File";
    enable "Debug", panels => [ qw(DBITrace Memory Timer) ];
  
    mount "/narwhale"=> $app1;
    mount "/unicorn"  => $app2;
};

它是怎么样工作的? 这有三个巧妙技巧.

技巧 #1

第一个巧妙的技巧是 builder 块.

subbuilder(&) {
    my$block= shift;
    ...
}

这个 & 是函数原型. Perl 常常有一些于对传过来给函数的参数进行限制的需求. 这可以看看 perldoc perlsub 中有关 &:

“&” 需要一个匿名的子程序,其中,如果作为第一个参数传递,不需要 “sub” 的关键字或其后的顿号.

如果我试图传给 builder() 一个标量或数组或任何不是一个匿名函数的东西, 将得到一个编译时错误. 但如果我给它传递一个匿名函数, 编译器才会让事情继续下去.

技巧 #2

接下来的技巧是在 Plack::Builder 内部实现 DSL keywords 应对函数名和指定的函数.

packagePlack::Builder;
usestrict;
useparent qw( Exporter );
our@EXPORT= qw( builder enable enable_if mount );
...
subenable    {...}
subenable_if {...}
submount     {...}
# etc

技巧 #3

还有一个有趣的想法. 注意这我们使用了 enable, enable_if, 或者 mount 在我们的 builder 块之外会出错. 这能正常是因为在 DSL 的关键字是函数的代码块引用. 默认的代码块内部是 croaks 的错误. 但在 builder 运行时, 这些旨用就会被真实代码所替换.

下面是一些简单的代码来说明它是如何工作的.

our$_enable= sub{ Carp::croak(...) }; # << 定义一个代码块引用
  
subenable { $_enable->(@_) }
  
subbuilder(&) {
    my$block= shift;
    ...
    local$_enable= sub{...}; # << 暂时分配实际工作代码
    ...
    my$app= $block->();
    ...
}
来源: <http://blog.kablamo.org/2014/04/12/read-plack-4/>

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. perl更新/修改/删除文本文件内容 (累计阅读 10,647)
  2. perl大牛flw传说 (累计阅读 7,713)
  3. AWStats是一个基于Perl的WEB日志分析工具。 (累计阅读 7,173)
  4. perl模块Getopt::Std用法及实例-从命令行读取参数模块 (累计阅读 7,017)
  5. [Perl] Template::Toolkit 模板技术. (累计阅读 6,344)
  6. Perl命令行常见用法及技巧 (累计阅读 5,912)
  7. PHP将死,何以为继? (累计阅读 5,917)
  8. 在perl中连接和使用sqlite做数据存储 (累计阅读 5,810)
  9. Perl 倒行分析文件方法。perl读文本文件,从末尾往前读. (累计阅读 5,607)
  10. perl的expect使用方法,实现非交互式登录。 (累计阅读 5,485)