"Use of uninitialized value $_" 带有 Mojo::UserAgent 非阻塞请求的警告

"Use of uninitialized value $_" warning with a Mojo::UserAgent non-blocking request

我正在尝试发出非阻塞请求 Mojo::UserAgent 但是当我 运行 下面的代码时,我得到

Use of uninitialized value $_ in concatenation (.) or string

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;

$_ 是一种特殊的变量,其值取决于上下文。在 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";
   });
}