按照问题.我知道有一个"0但是真的"在布尔上下文中是真的但是否则为false,但是在布尔上下文中可以返回false但是具有非零值(显而易见的地方是返回状态,其中0表示成功,任何事情别的是错误).
没有.(除了双变量和重载对象的乐趣)
Perl标量的真实性主要取决于字符串值.如果不存在字符串值,则将使用数字字段.
假值是:undef,"",0,和由第一测试字串避免出现问题:"0".
并非所有在数字上为零的都评估为假:"0E0"是真的,更自我记录也是如此"0 but true".后者是特殊的,以避免非数字警告.
但是,请输入dualvars.标量的数字和字符串字段不必同步.常见的dualvar是$!变量,它是数字上下文中的errno,但是包含原因作为字符串的错误字符串.因此,可以创建具有数值42和字符串值的dualvar "",它将评估为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
Run Code Online (Sandbox Code Playgroud)
然后重载对象.以下类的实例将很好地进行字符串化,但仍然在布尔上下文中求值为false:
package FalseString;
sub new {
my ($class, $str) = @_;
bless \$str => $class;
}
use overload
'""' => sub { ${shift()} },
'bool' => sub { 0 };
Run Code Online (Sandbox Code Playgroud)
测试:
my $s = FalseString->new("foo");
say $s;
say $s ? "true" : "false";
Run Code Online (Sandbox Code Playgroud)
打印
foo
false
Run Code Online (Sandbox Code Playgroud)