在布尔比较中,Perl中使用空字符串作为false是安全/良好做法吗?Perl - 将空字符串用作false是否是好习惯?
例如:
my $s = '';
if($s) {
print 'true';
} else {
print 'false';
}
或将长度函数是一个更好的方式去:
my $s = '';
if(length($s) > 0) {
print 'true';
} else {
print 'false';
}
在布尔比较中,Perl中使用空字符串作为false是安全/良好做法吗?Perl - 将空字符串用作false是否是好习惯?
例如:
my $s = '';
if($s) {
print 'true';
} else {
print 'false';
}
或将长度函数是一个更好的方式去:
my $s = '';
if(length($s) > 0) {
print 'true';
} else {
print 'false';
}
当在表达式中测试true/false时,应该仔细考虑你真正想要测试的内容。
如果你有一个字符串,你需要检查它是否具有任何价值可言,然后测试的是:
if (defined $string) { ... }
如果从一个功能,或者检测合格回一个“布尔”值一些内部操作的结果,则执行一个布尔检查:
if ($value) { ... }
在Perl中,“真”取决于其被评估的方式。如果您只是简单地说if ($value)
,那么唯一的字符串评估为false的值是空字符串''
和文字零'0'
。 (此外,任何未定义的值是假,所以如果$value
从未被分配,这将是假太。)
有可评估为假以数值上下文中,例如0E0
,0.0000
其他值,和字符串'0 but true'
。所以“真相是什么”这个问题真的取决于程序员需要注意的上下文。
在内部,Perl使用''
作为false,而1
作为真值(例如,作为任何布尔表达式的结果,例如!$value
)。将任何值“规范化”为这两个值之一的常用技巧是!!$value
- 它将值反转两次,给出''
或1
。
它值得一提的是,在检查真相时,各种铸造操作员是有用的。特别是,双重否定'!!'将总是将一个值转换为有效的布尔值 – 2010-07-07 17:42:47
@Eric:我认为您在添加最后一句时添加了该评论:D – Ether 2010-07-07 17:44:21
字符串可以有长度,但仍是假的 - 具体而言,串'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'
是一个虚假但有效的回答:“我的第一年很棒,然后一切都变得糟糕透了。”
Vivin - 不知道你的意思是 – user210757 2010-07-07 19:17:12