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

gpfsuwkq  于 2022-11-15  发布在  Perl
关注(0)|答案(9)|浏览(189)

我试过:

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

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

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

q9yhzks01#

在Perl中,下列条件式会评估为false:

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

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

y4ekin9u

y4ekin9u2#

从5.36开始,你可以使用builtin模块/命名空间中的truefalse。这些是特殊的true和false值,可以使用is_bool来识别。目前这是一个实验性的特性。
但是,虽然这些标量可以说是返回真和假,但它们只是分别返回真或假的值。事实上,每个标量不是真就是假。
我所遇到的关于 * 虚假价值 * 的最完整、最简洁的定义是:
任何字符串化为空字符串或字符串0的字符串都是false,其他字符串都是true。
因此,下列值为false:

  • false(5.36以上)
  • 空字符串
  • 数值零
  • 未定义的值
  • 具有多载布林运算子的对象,该运算子会评估上述其中一项。
  • 一个神奇的变量,在获取时计算为上述值之一。

任何其他标量都为真。
请记住,空列表文字(())在标量上下文中计算为未定义的值,因此它计算为false。

关于“真零”的说明

如果数字串化为0,则为false;如果数字串化为0,则不一定为false。只有0和空字符串为false。其他任何字符串,即使数字串化为0,也为true。
以下是布尔值为true,数字为零的字符串:

  • 毫无预兆地:
  • "0.0"
  • "0E0"
  • "00"
  • "+0"
  • "-0"
  • " 0"
  • "0\n"
  • x1米15英寸
  • "0."
  • "0 but true"
  • "\t00"
  • x1米19英寸1x
  • x1米20英寸
  • 附带警告:
  • Scalar::Util::looks_like_number传回false的任何字串。(例如"abc"
5w9g7ksd

5w9g7ksd3#

Perl本身没有boolean类型,但是可以使用整数或字符串的比较来获得相同的行为。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中非常常见的混淆源。

3j86kqsm

3j86kqsm4#

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

vshtjzan

vshtjzan5#

我最喜欢的

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

其完全独立于内部表示。

cx6n0qe3

cx6n0qe36#

我遇到了一个tutorial,它对Perl中什么值是true和false有很好的解释。它声明:
以下标量值被视为false:

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

所有其他标量值(包括以下值)均为真:

  • 1任何非0数字
  • ' '返回包含空格的字符串
  • '00'字符串中有两个或多个0字符
  • "0\n"一个0后跟一个换行符
  • 'true'
  • 'false'是的,即使字符串'false'也计算为true。

有另一个很好的教程,解释关于Perl true and false

pkbketx9

pkbketx97#

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
n53p2ov0

n53p2ov08#

使用下面的文件前缀,这将添加到您的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' )
             };

实际上,你应该使用它的原因并不多。
我的理由是,使用JSON时,我得到了0和1作为键的值,但是这个技巧将确保正确的值沿着脚本保存。

wf82jlnq

wf82jlnq9#

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

https://docs.raku.org/type/Bool
https://docs.raku.org/language/syntax#index-entry-Boolean_(literals)

相关问题