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

我试过:

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

这些都没用。我得到错误消息

Bareword "false" not allowed while "strict subs" is in use.
265801 次浏览

在Perl中,以下语句在条件条件中求值为false:

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

其余的都是真的。truefalse没有裸词。

Perl没有原生布尔类型,但是您可以使用比较整数或字符串来获得相同的行为。艾伦的例子就是一个很好的比较整数的方法。这里有一个例子

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

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

从5.36开始,你可以在内装式模块/命名空间中使用truefalse。这些是特殊的true和false值,可以使用is_bool来标识。这是目前的一个实验性特性。

但是,虽然它们可以说返回 true和false,但它们分别是一个 true或false值。事实上,每个标量不是真就是假。

我所遇到的一个错误的值最完整、最简洁的定义是:

任何string为空字符串或字符串0的值都是假的。其他的都是真的。

因此,以下值为false:

  • false (5.36 +)
  • 空字符串
  • 数值0
  • 未定义的值
  • 具有重载布尔运算符的对象,用于计算上述运算符之一。
  • 一个神奇的变量,在获取时求值为上述变量之一。

任何其他标量都为真。

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


关于“真正的零”的注释

虽然将字符串化为0的数字是假的,但将字符串化为0的则不一定是假的。唯一的假字符串是0和空字符串。任何其他字符串,即使它numalize为0,也是true。

以下字符串作为布尔值为真,作为数字为零:

  • 没有警告:
    • "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")

bobf对布尔值给出了漂亮的解释

真理测试不同的价值观

                       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,它实际上将是REAL(!)真和假(就像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将确保正确的值沿着你的脚本。

我遇到了一个教程,它对在Perl中什么值是true和false有很好的解释。它指出:

以下标量值被认为是假的:

  • undef -未定义的值
  • 0表示数字0,即使你把它写成000或0.0
  • ''空字符串。
  • '0'包含单个0数字的字符串。

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

  • 1任何非0的数字
  • ' '包含空格的字符串
  • '00'字符串中两个或多个0字符
  • "0\n" 0后面跟着换行符
  • 'true'
  • 'false'是的,即使字符串'false'的结果也是true。

还有一个很好的教程解释了Perl true和false

我最喜欢的一直是

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

它完全独立于内部表示。

Raku(以前称为Perl_6的编程语言)中的布尔值:

~$ raku
Welcome to 𝐑𝐚𝐤𝐮𝐝𝐨™ v2021.06.
Implementing the 𝐑𝐚𝐤𝐮™ programming language v6.d.
Built on MoarVM version 2021.06.


To exit type 'exit' or '^D'


> my $var = False;
False
> say $var;
False


> say $var.^name
Bool
> say $var.WHAT
(Bool)


> say ++$var
True
> say --$var
False


> say $var.Int
0
> say $var.Int + 1
1
> say ($var.Int + 1).Bool
True
> say $var.Int - 1
-1
> say ($var.Int - 1).Bool
True


> say $var.succ
True
> say $var.Int.succ
1
> say $var.pred
False
> say $var.Int.pred
-1


> say ++($var.Int); #ERROR
Cannot resolve caller prefix:<++>(Int:D); the following candidates
match the type but require mutable arguments:
(Mu:D $a is rw)
(Int:D $a is rw --> Int:D)
#<SNIP>
> say --($var.Int); #ERROR
Cannot resolve caller prefix:<-->(Int:D); the following candidates
match the type but require mutable arguments:
(Mu:D $a is rw)
(Int:D $a is rw --> Int:D)
#<SNIP>


> exit
< p > https://docs.raku.org/type/Bool
https://docs.raku.org/language/syntax index-entry-Boolean_(文字) < / p >