Как запретить 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 и выше: проблема решена.
Ответы
Ответ 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);
делает трюк. Я предпочитаю это, потому что он не отключает предупреждения ни для чего другого, и это немного более описательно.
Ответ 4
Начиная с perl 5.19.6, это предупреждение отключено для всех видов использования $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
В основном он ничего не делает, но отключает предупреждение. Подумайте о том, чтобы сохранить комментарий, чтобы будущие сопровождающие не могли читать ваши мысли.