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

FMc*_*FMc 20 perl

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;
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,我得到这样的警告:

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.

有一种优雅的方式来处理这个问题吗?

更新:

请参阅Ether for perl v5.19.6及更高版本的答案:问题已解决.

eph*_*ent 23

取决于你认为优雅的东西.

no warnings qw(once);
our ($a, $b);
Run Code Online (Sandbox Code Playgroud)

这两个中的一个就足够了.您甚至可以轻松限制其范围.

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

明确指定包也会抑制警告.如果你在main,

my @sums = pairwise { $::a + $::b } @x, @y;
Run Code Online (Sandbox Code Playgroud)

  • 如果我可以在该代码之后引用该行,"这两个中的一个就足够了". (3认同)

szb*_*int 6

这可能是一个错误List::Util.

全局关闭警告可能不是一个好主意,但你可以这样做:

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

这将仅关闭该部分代码的相关警告类别.


mas*_*onk 6

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

our ($a, $b);
Run Code Online (Sandbox Code Playgroud)

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


Eth*_*her 5

从perl 5.19.6开始,对于所有用途和所有用途都禁用此警告.$a$b