0

我正在尝试发出非阻塞请求, 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;
4

1 回答 1

5

$_是一种特殊类型的变量,其值取决于上下文。在foreach (@ip)上下文中,它被设置为@ip数组中特定项目的别名。但是,for 的回调$ua->get(...)不会在foreach (@ip)上下文中执行,因此$_不再是@ip数组的别名。

您需要使用foreach (@ip)循环内的普通变量,而不是使用这个特殊变量,以便它可以绑定到子例程(另见什么是perlfaq7 中的闭包):

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";
   });
}
于 2018-09-09T10:47:43.740 回答