如何在Perl中使用布尔变量?

时间:2009-06-24 04:08:11

标签: perl boolean

我试过了:

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

这些都不起作用。我收到错误消息

Bareword "false" not allowed while "strict subs" is in use.

8 个答案:

答案 0 :(得分:276)

在Perl中,以下在条件语句中评估为false:

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

其余的都是如此。 truefalse没有裸词。

答案 1 :(得分:69)

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

任何字符串化为空字符串或字符串“0”的内容都是false。其他一切都是真的。

因此,以下值为false:

  • 空字符串
  • 数值零
  • 未定义的值
  • 具有重载布尔运算符的对象,用于计算上述之一。
  • 一个神奇的变量,可以在fetch中评估上述内容之一。

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


关于“真正的零”的说明

虽然字符串化为0的数字为false,但编号为零的字符串不一定是。唯一的错误字符串是0和空字符串。任何其他字符串,即使它编号为零,也是如此。

以下是作为布尔值为真的字符串,为数字为零。

  • 没有警告:
    • "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的任何字符串。 (例如"abc"

答案 2 :(得分:57)

Perl没有本机布尔类型,但您可以使用整数或字符串的比较来获得相同的行为。 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";
}

标记为“use constant”的行定义一个名为true的常量,总是求值为1,一个名为false的常量始终求值为0.由于在Perl中定义常量的方式,下面的代码行失败以及:

true = 0;
true = false;

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

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

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中常见的混淆源。

答案 3 :(得分:16)

我推荐use boolean;。您必须从cpan安装boolean模块。

答案 4 :(得分:10)

我的最爱一直是

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

完全独立于内部表示。

答案 5 :(得分:7)

我遇到了一个tutorial,其中有很好的解释在Perl 中哪些值是真和假的。它声明:

以下标量值被视为错误:

  • undef - 未定义的值
  • 0数字0,即使您将其写为000或0.0
  • ''空字符串。
  • '0'包含单个0位的字符串。

所有其他标量值,包括以下内容均为真:

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

还有另一个很好的教程可以解释Perl true and false

答案 6 :(得分:5)

bobf对布尔值给出的美妙解释:True or False? A Quick Reference Guide

真实测试不同的值

                       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

答案 7 :(得分:0)

使用以下文件前缀,这将添加到你的perl脚本eTRUE和eFALSE,它实际上是REAL(!)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' )
             };

实际上,您应该使用它的原因很少。

我的理由是使用JSON,我将0和1作为键的值,但是这个hack将确保在脚本中保留正确的值。