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 但为假”?的主要内容,如果未能解决你的问题,请参考以下文章

在 Perl 中有啥理由更喜欢 glob 而不是 readdir(反之亦然)?

Python中是不是有类似于Perl中的“想要”的东西

如何在 Perl 测试套件中并行运行一些但不是所有测试?

继续而不是 Perl 中的“或死”

检查一个分叉的孩子是不是已经在 perl 中执行

perl变量到模块