Perl中Boolean


Perl本是无类型的脚本语言,如果一定要说有类型,那也肯定是标量、数组和哈希;布尔值是true和false,perl在v5.36之间没有原生的boolean类型。
最简单还是用数字0、1来代表false、true这些,perl 对boolean类型的解释基本上都是来自C语言;而C在1999年就引入了bool变量,Perl引入bool变量是在2020年之后了。引用perlsyn文档的"Truth and Falsehood"一节对此也有提及,因此广义上的True与False定义如下:
False values
number 0 and '0' string values
undef values
Empty list (),('')
"",'' # Empty scalar
True values:
any numbered string or numbers other than 0 and "0" values
empty []
There are no barewords for true or false. (Note: Perl v5.38 introduced true and false through the new builtin pragma).
True与False没有明显的区别。 (注意:Perl v5.38通过新的内置pragma引入了true和false)。
https://perldoc.perl.org/builtin
从v5.36开始,可以在内置(builtin)模块/命名空间中使用true和false。这些是可以使用is_bool识别的特殊true和false值。不过这是一个实验性的特征。
虽然这些可以返回true和false,但它们分别只是一个true或false值。事实上,每个标量要么是非真即假。目前所能遇到的关于假值的最完整、最简洁的定义是:
任何字符串化为空字符串或字符串0的都是false。其他的都是真。
因此,以下值为false(原文就不译为中文了,直观):
The empty string.
The string 0.
A signed integer with value zero.
An unsigned integer with value zero.
A floating point number with value positive zero.
A floating point number with value negative zero.
An undefined value.
An object with an overloaded boolean operator that evaluates one of the above.
A magical variable that evaluates to one of the above on fetch.
任何其他标量都是真。对于'0'在变量值中的使用会有一些小的歧义,具体可参考"true zeroes"。
The number 0, the strings '0' and '', the empty list "()", and "undef" are all false in a boolean context. All other values are true.
Negation of a true value by "!" or "not" returns a special false value. When evaluated as a string it is treated as '', but as a number, it is treated as 0.
数字0, 字符串'0'及'',空列表"()",以及"undef"在布尔上下文中都是false,其它值为true。
使用 "!" 或 "not" 否定一个真值,会返回一个特定的假值。当作为字符串计算时,把它看成'',但是作为数字时,它是0。
所以,以下标量被认定为false:
undef - 未定义值
0 数字0, 即便你写的是000或0.0
'' 空字符串.
'0' 包含单个0数字的字符串.
其它所有的标量(包括下面的)是true:
1 任何非0数字
' ' 有一个空格的字符串
'00' 两个及以上'0'字符的字符串
"0\n" 0及后面跟有一个换行符
'true'
'false' 没错, 即便是字符串'false'也被认定为是true.
我想这大概是因为Perl的创始人 Larry Wall 有着一个积极的世界观;他可能认为世上坏的和假的事情是很少的,大多数事情都是真的。
A note on "true zeroes"
关于"真零"的一点注记
字符串化为0的数字是false,但字符串化为0的数字不一定是false。唯一的假字符串是0和空字符串。任何其他字符串,即使它被数值化为零,也是true。
While numbers that stringify to 0 are false, strings that numify to zero aren't necessarily. The only false strings are 0 and the empty string. Any other string, even if it numifies to zero, is true.
下面是布尔值为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的任何字符串(e.g."abc")。
use v5.32;
use constant {false => 0,true => 1};
my ($val1,$val2) = (true,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 FALSE => 1==0;
use constant TRUE => not FALSE;
可在cpan上安装boolean模块,再使用它:
use boolean
下面是一个表格示例:
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
新的版本可引入使用
use v5.38;
use experimental qw(builtin);
use builtin qw(true false);
my $var = false;
另外也可以使用Scalar::Util模块中'dualvar'来实现此类魔法。
use Scalar::Util 'dualvar';
$false = dualvar(0, '');
参考来源:
Perl 5.38
Truth and Falsehood
最简单还是用数字0、1来代表false、true这些,perl 对boolean类型的解释基本上都是来自C语言;而C在1999年就引入了bool变量,Perl引入bool变量是在2020年之后了。引用perlsyn文档的"Truth and Falsehood"一节对此也有提及,因此广义上的True与False定义如下:
False values
number 0 and '0' string values
undef values
Empty list (),('')
"",'' # Empty scalar
True values:
any numbered string or numbers other than 0 and "0" values
empty []
There are no barewords for true or false. (Note: Perl v5.38 introduced true and false through the new builtin pragma).
True与False没有明显的区别。 (注意:Perl v5.38通过新的内置pragma引入了true和false)。
https://perldoc.perl.org/builtin
从v5.36开始,可以在内置(builtin)模块/命名空间中使用true和false。这些是可以使用is_bool识别的特殊true和false值。不过这是一个实验性的特征。
虽然这些可以返回true和false,但它们分别只是一个true或false值。事实上,每个标量要么是非真即假。目前所能遇到的关于假值的最完整、最简洁的定义是:
任何字符串化为空字符串或字符串0的都是false。其他的都是真。
因此,以下值为false(原文就不译为中文了,直观):
The empty string.
The string 0.
A signed integer with value zero.
An unsigned integer with value zero.
A floating point number with value positive zero.
A floating point number with value negative zero.
An undefined value.
An object with an overloaded boolean operator that evaluates one of the above.
A magical variable that evaluates to one of the above on fetch.
任何其他标量都是真。对于'0'在变量值中的使用会有一些小的歧义,具体可参考"true zeroes"。
The number 0, the strings '0' and '', the empty list "()", and "undef" are all false in a boolean context. All other values are true.
Negation of a true value by "!" or "not" returns a special false value. When evaluated as a string it is treated as '', but as a number, it is treated as 0.
数字0, 字符串'0'及'',空列表"()",以及"undef"在布尔上下文中都是false,其它值为true。
使用 "!" 或 "not" 否定一个真值,会返回一个特定的假值。当作为字符串计算时,把它看成'',但是作为数字时,它是0。
所以,以下标量被认定为false:
undef - 未定义值
0 数字0, 即便你写的是000或0.0
'' 空字符串.
'0' 包含单个0数字的字符串.
其它所有的标量(包括下面的)是true:
1 任何非0数字
' ' 有一个空格的字符串
'00' 两个及以上'0'字符的字符串
"0\n" 0及后面跟有一个换行符
'true'
'false' 没错, 即便是字符串'false'也被认定为是true.
我想这大概是因为Perl的创始人 Larry Wall 有着一个积极的世界观;他可能认为世上坏的和假的事情是很少的,大多数事情都是真的。
A note on "true zeroes"
关于"真零"的一点注记
字符串化为0的数字是false,但字符串化为0的数字不一定是false。唯一的假字符串是0和空字符串。任何其他字符串,即使它被数值化为零,也是true。
While numbers that stringify to 0 are false, strings that numify to zero aren't necessarily. The only false strings are 0 and the empty string. Any other string, even if it numifies to zero, is true.
下面是布尔值为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的任何字符串(e.g."abc")。
use v5.32;
use constant {false => 0,true => 1};
my ($val1,$val2) = (true,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 FALSE => 1==0;
use constant TRUE => not FALSE;
可在cpan上安装boolean模块,再使用它:
use boolean
下面是一个表格示例:
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
新的版本可引入使用
use v5.38;
use experimental qw(builtin);
use builtin qw(true false);
my $var = false;
另外也可以使用Scalar::Util模块中'dualvar'来实现此类魔法。
use Scalar::Util 'dualvar';
$false = dualvar(0, '');
参考来源:
Perl 5.38
Truth and Falsehood