Подтвердить что ты не робот

Как запретить List:: MoreUtils предупреждать об использовании $a и $b только один раз?

Модуль List::MoreUtils указывает, что вы используете переменные $a и $b при поставке BLOCK, который идет с pairwise. Например:

use strict;
use warnings;
use List::MoreUtils qw'pairwise';

my @x = ( 1 ..  5);
my @y = (11 .. 15);
my @sums = pairwise { $a + $b } @x, @y;

Но когда я это делаю, я получаю такие предупреждения:

Name "main::b" used only once: possible typo at try.pl line 7.
Name "main::a" used only once: possible typo at try.pl line 7.

Есть ли элегантный способ справиться с этой проблемой?

Update:

См. ответ от Ether для perl v5.19.6 и выше: проблема решена.

4b9b3361

Ответ 1

В зависимости от того, что вы считаете элегантным.

no warnings qw(once);
our ($a, $b);

Один из этих двух будет достаточным. Вы даже можете легко ограничить их сферу.

my @sums = pairwise { no warnings qw(once); $a + $b } @x, @y;
my @sums = pairwise { our $a + our $b } @x, @y;

Явное указание пакета также подавит предупреждение. Если вы находитесь в main,

my @sums = pairwise { $::a + $::b } @x, @y;

Ответ 2

Вероятно, это ошибка в List::Util.

Отключение предупреждений по всему миру, вероятно, не очень хорошая идея, однако вы можете сделать что-то вроде этого:

{
  no warnings 'once';
  return join("_", @monsters) if @monsters && List::Util::reduce { $a && $b // 0 > 0 } 1,@monsters;
}

Это приведет к отключению соответствующей категории предупреждения только для этой части кода.

Ответ 3

Да, это не ты. Вы не можете предупреждать "один раз"; или вы можете предугадать $a и $b, чтобы они больше не использовались.

our ($a, $b);

делает трюк. Я предпочитаю это, потому что он не отключает предупреждения ни для чего другого, и это немного более описательно.

Ответ 5

Добавьте это в верхней части вашей программы:

use vars qw( $a $b );

или, если вам не нравится "устаревшая" часть perldoc vars, просто добавьте:

our ( $a, $b );

Ответ 6

У меня такая же проблема с аналогичным модулем, который я пишу. Единственное решение, которое я нашел (кроме использования функций, которые используют $a и $b дважды, конечно), - это поставить эту строку где-то в вашем коде:

$a = $b; # hack to disable warnings about "main::a" used only once

В основном он ничего не делает, но отключает предупреждение. Подумайте о том, чтобы сохранить комментарий, чтобы будущие сопровождающие не могли читать ваши мысли.