As per the question. I know there's "0 but true" which is true in a boolean context but false otherwise, but can return something false in a boolean context but with a non-zero value (the obvious place for this is return statuses where 0 is success and anything else is an error).
问问题
206 次
1 回答
9
不。(除了双变量和重载对象的乐趣)
Perl 标量的真实性主要取决于字符串值。如果不存在字符串值,则将使用数字字段。
错误值是:undef
、""
、0
,并通过首先测试字符串化来避免问题:"0"
。
并非所有数值为零的东西都评估为 false:"0E0"
是 true,因此更自我记录的"0 but true"
. 后者是特殊情况以避免非数字警告。
但是,输入dualvars。标量的数字和字符串字段不必同步。常见的对偶$!
变量是数字上下文中的 errno 变量,但错误字符串包含作为字符串的原因。因此,可以创建一个具有数值42
和字符串 value的对偶变量""
,其评估结果为 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
于 2013-04-18T08:55:28.203 回答