Предупреждение «Использование неинициализированного значения $ _» с неблокирующим запросом Mojo :: UserAgent - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь сделать неблокирующий запрос с 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;

1 Ответ

0 голосов
/ 09 сентября 2018

$_ - это особая переменная, значение которой зависит от контекста. Внутри контекста foreach (@ip) он задается как псевдоним определенного элемента в массиве @ip. Но обратный вызов для $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";
   });
}
...