我试图使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