有“0但是真实”,但perl中有“42但是假”吗?

时间:2013-04-18 08:35:04

标签: perl exit-code

根据问题。我知道有一个“0但是真的”在布尔上下文中是真的但是否则为false,但是在布尔上下文中可以返回false但是具有非零值(显而易见的地方是返回状态,其中0表示成功,任何事情别的是错误的。)

1 个答案:

答案 0 :(得分:8)

没有。 (除了带有双变量和重载对象的乐趣)

Perl标量的真实性主要取决于字符串值。如果不存在字符串值,则将使用数字字段。

错误值为:undef""0,并且首先通过测试字符串来避免问题:"0"

并非数值零的所有内容都评估为false:"0E0"为真,自我记录"0 but true"也越多。后者是特殊的,以避免非数字警告。

但是,请输入 dualvars 。标量的数字和字符串字段不必同步。常见的dualvar是$!变量,它是数字上下文中的errno,但是包含原因作为字符串的错误字符串。因此,可以创建一个数值为42且字符串值为""的双变量,它将评估为false。

use Scalar::Util qw/dualvar/;

my $x = dualvar 42, "";
say $x;   # empty string
say 0+$x; # force numeric: 42
say $x ? 1 : 0; # 0

然后重载对象。以下类的实例将很好地进行字符串化,但仍然在布尔上下文中计算为 false

package FalseString;
sub new {
  my ($class, $str) = @_;
  bless \$str => $class;
}
use overload
  '""'   => sub { ${shift()} },
  'bool' => sub { 0 };

测试:

my $s = FalseString->new("foo");
say $s;
say $s ? "true" : "false";

打印

foo
false