我已经尝试过:
$var = false;
$var = FALSE;
$var = False;
这些都不起作用。我收到了错误消息
在启用 "strict subs" 时,不允许使用裸字 "false"
数字0,字符串'0'和"",空列表"()"以及"undef"在布尔上下文中都是假的。其他所有值都是真的。
在Perl中,以下情况在条件语句中被判断为假:
0
'0'
undef
'' # Empty scalar
() # Empty list
('')
true
或false
。(注意:Perl v5.38通过新的builtin编译指示引入了true
和false
)。undef
。 - ikegami('')
和''
是相同的值。我认为你想暗示一个由空字符串组成的元素列表(尽管圆括号不创建列表),但正如我已经提到的,无法检查列表是真还是假。 - ikegami!0
或PL_sv_yes
)和false(!1
或PL_sv_no
)。您是说,当测试真值时,除这两个值之外的任何值都应该引发Perl错误吗?那将非常糟糕。例如:它将阻止$x ||= $default;
的执行。 - ikegamitrue
和false
。这些是特殊的true和false值,可以使用is_bool
进行识别。目前,这是一个实验性的功能。任何转化为空字符串或字符串0
的内容都是假值。其他所有内容都是真值。
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"
)my $value = do { package XXX; use overload q[""] => sub { "XXX" }, q[bool] => sub { 0 }; bless [] };
。现在,$value
将被字符串化为“XXX”,但布尔值为false。 - tobyinkbool
返回值会被字符串化为 0
。此外,不建议创建不一致的重载,并且您返回的值可能被视为这种情况。(例如,&&
可以优化为 ||
,因此如果这些不一致,您将遇到问题。) - ikegami0x00
。 - ZaidPerl没有本地支持布尔类型,但您可以使用整数或字符串的比较来获得相同的行为。 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中是非常容易引起混淆的。use warnings;
代替#! perl -w
。 - Brad Gilbertif ($exitstatus) { exit; }
和 if ($exitstatus == true) { exit; }
,这对于一个普通观察者可能并不明显。(是的,最后一个例子是糟糕的编程风格,但那不是重点)。 - Zano我的最爱一直是
use constant FALSE => 1==0;
use constant TRUE => not FALSE;
这是完全独立于内部表述的。
我建议使用use boolean;
。不过你需要从cpan安装boolean模块。
if ($my_true_value == true)
。假装有一个唯一的真理是我经验中的一条痛苦之路,也是编写低效代码的路径。请记得保持原文的意思,使翻译内容通俗易懂。 - tjd在(快速参考指南)True or False? 中,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,实际上将是真和假(就像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作为键的值,但这个技巧可以确保正确的值沿着你的脚本保持一致。
true
或 false
。use v5.38;
use experimental qw(builtin);
use builtin qw(true false);
my $var = false;
~$ 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)
builtin
package 获得了“真”和“假”“区分布尔值”。 - undefined