我试图用Mojo::UserAgent
发出一个非阻塞请求,但是当我运行下面的代码时,我得到
在串联(.)中使用未初始化值$_或字符串
在print
线路上。
如何在回调中访问$_
?
my $ua = Mojo::UserAgent->new();
my @ids = qw( id1 id2 id3 );
foreach ( @ids ) {
my $res = $ua->get('http://my_site/rest/id/'.$_.'.json' => sub {
my ($ua, $res) = @_;
print "$_ => " . $res->result->json('/net/id/desc'), "\n";
});
}
Mojo::IOLoop->start unless Mojo::IOLoop->is_running;
发布于 2018-09-09 18:47:44
$_
是一种特殊类型的变量,其值取决于上下文。在foreach (@ip)
上下文中,它被设置为@ip
数组中特定项的别名。但是,$ua->get(...)
的回调不会在foreach (@ip)
上下文中执行,因此$_
不再是@ip
数组的别名。
您不需要使用这个特殊变量,而需要使用foreach (@ip)
循环内的普通变量,以便可以将其绑定到子例程(另请参阅perlfaq7中的What's a closure ):
foreach (@ip) {
my $THIS_IS_A_NORMAL_VARIABLE = $_;
my $res= $ua->get( ... => sub {
my ($ua, $res) = @_;
print "$THIS_IS_A_NORMAL_VARIABLE =>" . $res->result->json('/net/id/desc'),"\n";
});
}
https://stackoverflow.com/questions/52243566
复制相似问题