代码之家  ›  专栏  ›  技术社区  ›  FMc TLP

如何防止list::moreutils警告只使用$A和$B一次?

  •  20
  • FMc TLP  · 技术社区  · 16 年前

    这个 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.
    

    有没有优雅的方法来处理这个问题?

    更新:

    answer by Ether 对于Perlv5.19.6及更高版本:问题已解决。

    6 回复  |  直到 12 年前
        1
  •  23
  •   ephemient    16 年前

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

    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
  •  6
  •   szbalint    15 年前

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

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

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

    这只会关闭该部分代码的相关警告类别。

        3
  •  6
  •   masonk    15 年前

    是的,不是你。您不能“一次”警告;也可以预先声明$A和$B,以便它们不再使用。

    our ($a, $b);
    

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

        4
  •  5
  •   Ether    12 年前

    从Perl 5.19.6开始, this warning is disabled 用于所有用途 $a $b 到处都是。

        5
  •  2
  •   user80168    16 年前

    在程序顶部添加此项:

    use vars qw( $a $b );
    

    或者,如果你不喜欢 perldoc vars ,只需添加:

    our ( $a, $b );
    
        6
  •  1
  •   Chris Lutz    16 年前

    对于我正在编写的类似模块,我也有同样的问题。我找到的唯一解决方案(除了使用 $a $b 当然,有两次)是将此行放在代码中的某个位置:

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

    它基本上什么也不做,但它确实禁用了警告。考虑保留评论,这样未来的维护人员就不必阅读你的想法。