Mojolicious 如何修改 Perl 语法

use*_*035 3 syntax perl mojolicious

阅读 Mojolicious minions 文档我发现了以下代码:

use v5.28;
use Mojolicious::Lite;
use experimental qw( signatures );
use Time::HiRes qw( time );

plugin Minion => {
    SQLite => 'sqlite:' . app->home->child('minion.db'),
};

# ...
app->start;
Run Code Online (Sandbox Code Playgroud)

他们是如何创建新语法的plugin Minion => {...}?我在经典 Perl 书籍中从未见过它。它是带有哈希参数的函数调用:“Minion”是键,hashref{...}是值吗?

他们还调用app->start-app是一个返回祝福的 hashref 的函数吗?但如果它是一个散列,为什么“start”不包含在大括号中?这个语法对我来说看起来很奇怪。

Сух*_*й27 6

app是一个函数,它返回的$app是一个实例Mojolicious::Lite=HASH

app->startapp()->start

https://github.com/mojolicious/mojo/blob/24d1d1987dbfbe27eaaa37dd5db692d2deb8d07f/lib/Mojolicious/Plugin/Config.pm#L12-L14

"sub app; local *app = sub { \$app }; use Mojo::Base -strict; $content";
                             |
                             ^ not a reference but escape
                             due to eval() of double quoted string
Run Code Online (Sandbox Code Playgroud)

再生产

perl -MMojolicious::Lite -E 'no warnings; sub foo; local *foo = sub { app }; say for foo, app'
Run Code Online (Sandbox Code Playgroud)

输出

Mojolicious::Lite=HASH(0xe72080)
Mojolicious::Lite=HASH(0xe72080)
Run Code Online (Sandbox Code Playgroud)

plugin是一个正则函数

perl -MData::Dumper -wE 'sub plugin { print Dumper \@_ } plugin Minion => { SQLite => "sqlite:" }'
$VAR1 = [
          'Minion',
          {
            'SQLite' => 'sqlite:'
          }
        ];
Run Code Online (Sandbox Code Playgroud)

您可以添加括号,并删除粗逗号,使其看起来像通常的函数调用,

plugin("Minion", { SQLite => "sqlite:" });
Run Code Online (Sandbox Code Playgroud)