perl 中有“0 但为真”,但是不是有“42 但为假”?
Posted
技术标签:
【中文标题】perl 中有“0 但为真”,但是不是有“42 但为假”?【英文标题】:There's "0 but true", but is there "42 but false" in perl?perl 中有“0 但为真”,但是否有“42 但为假”? 【发布时间】:2013-04-18 08:35:03 【问题描述】:根据问题。我知道有“0 但为真”,它在布尔上下文中为真,否则为假,但可以在布尔上下文中返回假但具有非零值(这明显的地方是返回状态,其中 0 是成功和任何东西否则是一个错误)。
【问题讨论】:
除非你算空列表()
或undef
?不是 AFAIK,尽管可能会遇到空列表。
【参考方案1】:
没有。 (除了双变量和重载对象的乐趣)
Perl 标量的真实性主要取决于字符串值。如果不存在字符串值,将使用数字字段。
错误值为:undef
、""
、0
,并通过首先测试字符串化来避免问题:"0"
。
并非所有数值为零的东西都评估为假:"0E0"
为真,更自我记录的"0 but true"
也是如此。后者是特殊情况以避免非数字警告。
但是,请输入 dualvars。标量的数字和字符串字段不必同步。一个常见的对偶变量是 $!
变量,它是数字上下文中的 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
【讨论】:
“严格”?严格从不发出警告; warnings 给出警告。以上是关于perl 中有“0 但为真”,但是不是有“42 但为假”?的主要内容,如果未能解决你的问题,请参考以下文章