在Perl中,在布尔比较中使用空字符串作为false是安全/良好的做法吗?
例如:
my $s = '';
if($s) {
print 'true';
} else {
print 'false';
}
或者长度函数是更好的方法:
my $s = '';
if(length($s) > 0) {
print 'true';
} else {
print 'false';
}
答案 0 :(得分:11)
在表达式中测试true / false时,您应该仔细考虑您实际想要测试的内容。
如果你有一个字符串,你需要检查它是否有任何价值,那么测试一下:
if (defined $string) { ... }
如果从函数传回“boolean”值,或测试某些内部操作的结果,则执行布尔检查:
if ($value) { ... }
在Perl中,“真相”取决于它的评估方式。如果您只是说if ($value)
,那么评估为false的唯一字符串值是空字符串''
和文字零'0'
。 (此外,任何未定义的值都是false,因此如果从未分配$value
,那也将是假的。)
在数字上下文中还有其他值可能会被评估为false,例如0E0
,0.0000
和字符串'0 but true'
。因此,“什么是真理”的问题实际上取决于程序员需要注意的上下文。
在内部,Perl使用''
表示false,1
表示真值(例如,作为任何布尔表达式的结果,例如!$value
)。将任意值“规范化”为这两个值之一的常用技术是!!$value
- 它将值反转两次,为您提供''
或1
。
答案 1 :(得分:6)
字符串可以有长度但仍然是假的 - 特别是字符串'0'
(详情:Perl Truth and Falsehood)。至少在一般情况下,length
不能提供真实的可靠测试。
my $s = '0';
print "'0' is false.\n" unless $s;
print "But it has length.\n" if length $s;
通常,您应该使用测试表达您真正关心的特性。例如,如果你要求用户输入他最喜欢的年龄,'0'
是一个错误但有效的回答:“我生命的第一年很棒,然后一切都变成了地狱。”