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.
有没有一种优雅的方法来处理这个问题?
更新
有关perl v5.19.6及更高版本的信息,请参阅answer by Ether:问题已解决。
答案 0 :(得分:23)
取决于你认为优雅的东西。
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;
答案 1 :(得分:6)
这可能是List::Util
中的错误。
全局关闭警告可能不是一个好主意,但你可以这样做:
{
no warnings 'once';
return join("_", @monsters) if @monsters && List::Util::reduce { $a && $b // 0 > 0 } 1,@monsters;
}
这将仅关闭该部分代码的相关警告类别。
答案 2 :(得分:6)
our ($a, $b);
诀窍。我倾向于这样做,因为它不会关闭任何其他内容的警告,而且它更具描述性。
答案 3 :(得分:5)
从perl 5.19.6开始,this warning is disabled用于$a
和$b
的所有用途。
答案 4 :(得分:2)
答案 5 :(得分:1)
我正在写一个类似模块的问题。我找到的唯一解决方案(当然,除了使用两次使用$a
和$b
的函数之外)是将此行放在代码中的某处:
$a = $b; # hack to disable warnings about "main::a" used only once
它基本上什么都不做,但它会禁用警告。考虑保留评论,以便未来的维护人员不必阅读你的想法。