警告没有发送到stderr

时间:2014-11-13 17:25:59

标签: perl

我有一个函数检查数据是否有效(即非负数),并且应该警告然后退出子。我遇到的问题是警告被抑制了。谁能解释为什么警告被压制?

#!/usr/bin/perl
use strict;
use warnings;

my $a = b();
print "Function returned $a\n";

sub b
{
    my $a = -1;
    ($a >= 0) || (warn "\$a is negative" && return 0);
    print "Passed negative check\n";
    return 1;
}

我收到的输出是

Function returned 0

1 个答案:

答案 0 :(得分:7)

优先权问题。

warn "\$a is negative" && return 0

装置

warn("\$a is negative" && return 0)

你想要

warn "\$a is negative" and return 0

warn("\$a is negative") && return 0

更好的是,应用这两个更改。

warn("\$a is negative") and return 0

当你在参数列表周围省略pare时,要小心陷阱。

通常情况下,如果RHS表达式包含流控制表达式,例如andordie,{{return,请使用nextlast 1}},redoexit


实际上,为什么要检查warn返回的内容?你真的想要

warn("\$a is negative"), return 0

do { warn "\$a is negative"; return 0 }

所以我们得到

$a >= 0
   or warn("\$a is negative"), return 0;

$a >= 0
   or do {
      warn "\$a is negative";
      return 0;
   };

但我怀疑大多数人更愿意看到

if ($a < 0) {
   warn "\$a is negative";
   return 0;
}