나는이 함수에 대한 매개 변수가 리터럴 익명의 서브가 아니라 앞에서 정의한 coderefs 인 곳에서 으로 작업하려고 시도하고 있습니다. Router::Resource 나는 코드 중복을 줄이기 위해 이것을하고있다.`&`프로토 타입이있을 때 어떻게 문자 그대로의 서브 쓰레드 대신 coderefs를 사용할 수 있습니까?
다음은 시놉시스의 코드입니다. 이 작동합니다.
# 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 코드를 변경 한 후 :
는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(&)
입니다 .
&
이 경우 통과 익명 서브 루틴을 필요&
가 제 1 위치 일 때, 호출자는, perlsub#Prototypes 볼 정렬sort { … } @list
와map { … }
대신sort sub { … }, @list
등과 같이 축약 구문을 사용할 수있게 첫 번째 인수로sub
키워드 또는 후속 쉼표가 필요하지 않습니다.
프로토 타입이있을 때 어떻게 문자 기반 서브 시스템 대신 coderefs를 사용할 수 있습니까?
'및 GET ($의 get_root)? –
Сухой27,이 작품, 아래에 적절한 대답을 그래서 내가 당신을 upvote 수 있습니다. – daxim