我試圖使Router::Resource工作 其中函數的參數不是文字匿名潛艇,但 coderefs先前定義。我正在這樣做以減少代碼重複。當有`&`原型時,我怎樣才能使用coderefs而不是文字subs?
下面是代碼摘要中的最小但工作方式。這工作。
# app.psgi
use 5.024;
use Router::Resource qw(resource router GET POST);
my $app = sub {
my ($env) = @_;
my $router = router {
resource '/' => sub {
GET { [200, [], ['get /']] };
};
resource '/blog/{year}/{month}' => sub {
GET { [200, [], ['get /blog']] };
POST { [200, [], ['post /blog']] };
};
};
$router->dispatch($env);
}
__END__
$ plackup &
$ http -b :5000
127.0.0.1 - - [17/Apr/2017:14:25:28 +0200] "GET/HTTP/1.1" 200 5 "-" "HTTPie/0.9.2"
get/
$ http -b :5000/blog/2017/4
127.0.0.1 - - [17/Apr/2017:14:26:15 +0200] "GET /blog/2017/4 HTTP/1.1" 200 9 "-" "HTTPie/0.9.2"
get /blog
$ http -b POST :5000/blog/2017/4
127.0.0.1 - - [17/Apr/2017:14:26:28 +0200] "POST /blog/2017/4 HTTP/1.1" 200 10 "-" "HTTPie/0.9.2"
post /blog
$ pkill -f plackup
從文字匿名改變內PSGI代碼到一個CODEREF,從而後:
my $get_root = sub { [200, [], ['get /']] };
⋮
resource '/' => sub {
GET $get_root;
};
然後程序將不再編譯:
$ perl -c app.psgi
Type of arg 1 to Router::Resource::GET must be block or sub {} (not private variable) at app.psgi line 8, near "$get_root;"
函數原型是GET(&)
。當&
是第一個位置,它允許呼叫者使用縮寫語法,有點像用sort { … } @list
和map { … }
代替sort sub { … }, @list
等,見perlsub#Prototypes:
的
&
要求匿名的子程序,其中,如果通過作爲第一個參數,不需要sub
關鍵字或後續逗號。
如何在代碼原型時使用coderefs代替文字subs?
'&GET($ get_root);'也許? –
Сухой27,這個工程,使它成爲一個正確的答案,所以我可以upvote你。 – daxim