Perl - 将空字符串用作false是一种好习惯吗?

use*_*757 4 string perl

在布尔比较中,在Perl中使用空字符串作为false是安全/良好的做法吗?

例如:

my $s = '';

if($s) {
 print 'true';
} else {
 print 'false';
}
Run Code Online (Sandbox Code Playgroud)

或者长度函数是更好的方法:

my $s = '';

if(length($s) > 0) {
 print 'true';
} else {
 print 'false';
}
Run Code Online (Sandbox Code Playgroud)

Eth*_*her 11

在表达式中测试true/false时,您应该仔细考虑您实际想要测试的内容.

如果你有一个字符串,你需要检查它是否有任何值,然后测试:

if (defined $string) { ... }
Run Code Online (Sandbox Code Playgroud)

如果从函数传回"boolean"值,或测试某些内部操作的结果,则执行布尔检查:

if ($value) { ... }
Run Code Online (Sandbox Code Playgroud)

在Perl中,"真相"取决于它的评估方式.如果您只是说if ($value),那么评估为false 的唯一字符串值是空字符串''和文字零'0'.(另外,任何未定义的值都是false,所以如果$value从未分配过,那也是假的.)

存在可以评估为假的其它值的数值范围内,例如0E0,0.0000和字符串'0 but true'.因此,"什么是真理"的问题实际上取决于程序员需要注意的上下文.

在内部,Perl ''用于虚假和1真实(例如,作为任何布尔表达式的结果,例如!$value).将任意值"规范化"为这两个值之一的常用技术是!!$value- 它将值反转两次,给出''或者1.

  • 值得一提的是,在检查真相时,各种铸造操作员都很有用.特别是,双重否定`!!`将始终将值转换为有效的布尔值 (2认同)

FMc*_*FMc 6

字符串可以有长度但仍然是假的 - 特别是字符串'0'(详情:Perl Truth和Falsehood).至少在一般情况下,length不提供真实的稳健测试.

my $s = '0';

print "'0' is false.\n"      unless $s;
print "But it has length.\n" if length $s;
Run Code Online (Sandbox Code Playgroud)

通常,您应该使用测试表达您真正关心的特性.例如,如果你要求用户输入他最喜欢的年龄,那么这'0'是一个错误但有效的回答:"我生命的第一年很棒,然后一切都变成了地狱."