如何防止List :: MoreUtils仅警告使用$ a和$ b一次?

时间:2009-09-29 04:02:47

标签: perl

List::MoreUtils模块表示您在提供$a函数的$b时使用变量BLOCKpairwise。例如:

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:问题已解决。

6 个答案:

答案 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)

是的,不是你。你不能一次发出警告;或者您可以预先声明$ a和$ b,以便它们不再使用一次。

our ($a, $b);

诀窍。我倾向于这样做,因为它不会关闭任何其他内容的警告,而且它更具描述性。

答案 3 :(得分:5)

从perl 5.19.6开始,this warning is disabled用于$a$b的所有用途。

答案 4 :(得分:2)

将其添加到程序的顶部:

use vars qw( $a $b );

或者,如果您不喜欢perldoc vars的“过时”部分,只需添加:

our ( $a, $b );

答案 5 :(得分:1)

我正在写一个类似模块的问题。我找到的唯一解决方案(当然,除了使用两次使用$a$b的函数之外)是将此行放在代码中的某处:

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

它基本上什么都不做,但它会禁用警告。考虑保留评论,以便未来的维护人员不必阅读你的想法。