如何在Perl中使用布尔variables?

我努力了:

$var = false; $var = FALSE; $var = False; 

这些都没有工作。 我收到错误消息

 当“严格的潜艇”被使用时,不允许使用“伪”字。 

在Perl中,以下条件中的值为false:

 0 '0' undef '' # Empty scalar () # Empty list ('') 

其余的都是如此。 没有truefalse赤裸裸的字眼。

我碰到的最完整,最简洁的错误定义是:

串行化为空string或string“0”的任何内容都是错误的。 其他一切都是真实的。

因此,以下值是错误的:

  • 空的string
  • 数值为零
  • 一个未定义的值
  • 带有重载布尔运算符的对象,用于评估上述之一。
  • 一个神奇的variables,取得上述之一。

请记住,空列表文字在标量上下文中评估为未定义的值,所以它的计算结果为false。


关于“真正的零”

虽然数字的string化为0是假的,string的数量为零不一定。 唯一的假string是0和空string。 任何其他string,即使它的数量为零,也是如此。

以下是作为布尔值为真的string,以及作为数字的零。

  • 没有警告:
    • "0.0"
    • "0E0"
    • "00"
    • "+0"
    • "-0"
    • " 0"
    • "0\n"
    • ".0"
    • "0."
    • "0 but true"
    • "\t00"
    • "\n0e1"
    • "+0.e-9"
  • 警告:
    • Scalar::Util::looks_like_number返回false的任何string。 (例如"abc"

Perl没有本地布尔types,但是可以使用整数或string的比较来获得相同的行为。 Alan的例子是使用整数比较的一个很好的方法。 这是一个例子

 my $boolean = 0; if ( $boolean ) { print "$boolean evaluates to true\n"; } else { print "$boolean evaluates to false\n"; } 

我在我的一些程序中所做的一件事是使用常量添加相同的行为:

 #!/usr/bin/perl use strict; use warnings; use constant false => 0; use constant true => 1; my $val1 = true; my $val2 = false; print $val1, " && ", $val2; if ( $val1 && $val2 ) { print " evaluates to true.\n"; } else { print " evaluates to false.\n"; } print $val1, " || ", $val2; if ( $val1 || $val2 ) { print " evaluates to true.\n"; } else { print " evaluates to false.\n"; } 

标记为“使用常量”的行定义了一个名为true的常量,其值总是为1,常量名为false的常量的值为0.由于常量是在Perl中定义的,因此以下代码行也会失败:

 true = 0; true = false; 

错误消息应该说“不能在标量赋值中修改常量”。

我在其中一个关于比较string的评论中看到了这一点。 您应该知道,因为Perl在标量variables中组合了string和数字types,所以您可以使用不同的语法来比较string和数字:

 my $var1 = "5.0"; my $var2 = "5"; print "using operator eq\n"; if ( $var1 eq $var2 ) { print "$var1 and $var2 are equal!\n"; } else { print "$var1 and $var2 are not equal!\n"; } print "using operator ==\n"; if ( $var1 == $var2 ) { print "$var1 and $var2 are equal!\n"; } else { print "$var1 and $var2 are not equal!\n"; } 

这些运算符之间的区别是Perl中常见的混淆之处。

我推荐use boolean; 。 你必须从cpan安装布尔模块。

我碰到一个教程 ,有一个很好的解释关于在Perl中什么值是真实的和错误的 。 它指出:

以下标量值被认为是错误的:

  • undef – 未定义的值
  • 0的数字0,即使你把它写为000或0.0
  • ''空的string。
  • '0'是包含单个0位的string。

所有其他标量值,包括以下值都是正确的:

  • 1任何非0号码
  • ' 'string中有一个空格
  • '00'两个或多个string中的0个字符
  • "0\n" a 0后跟一个换行符
  • 'true'
  • 'false'是的,即使string'假'评估为真。

还有一个很好的教程,解释了Perl的真假 。

我的最爱一直是

 use constant FALSE => 1==0; use constant TRUE => not FALSE; 

这是完全独立于内部表示。

bobf为布尔值给出的美丽解释: True还是False? 快速参考指南

真相testing不同的值

  Result of the expression when $var is: Expression | 1 | '0.0' | a string | 0 | empty str | undef --------------------+--------+--------+----------+-------+-----------+------- if( $var ) | true | true | true | false | false | false if( defined $var ) | true | true | true | true | true | false if( $var eq '' ) | false | false | false | false | true | true if( $var == 0 ) | false | true | true | true | true | true 

使用下面的文件前缀,这将添加到您的perl脚本eTRUE和eFALSE,它将实际上是真正的(!)true和false(就像java)

 #!/usr/bin/perl use strict; use warnings; use constant { #real true false, compatible with encode_json decode_json for later (we don't want field:false... will be field:0...) eTRUE => bless( do{\(my $o = 1)}, 'JSON::PP::Boolean' ), eFALSE => bless( do{\(my $o = 0)}, 'JSON::PP::Boolean' ) }; 

实际上,你应该使用它的原因很less。

我的理由是使用JSON,我有0和1作为值的键,但这个黑客将确保正确的价值观保持在你的脚本。