2011-12-12 51 views
0

在我的代码中,当我在输入中输入一些非数字字母(即$temp)时,它以“太冷!”作出响应。而不是“无效”。我错过了什么?IF语句意外的结果:“string”<= 72是真的?

#!/usr/bin/perl 

print "What is the temperature outside? "; 
$temp=<>; 
if ($temp > 72) { 
    print "Too hot!\n"; } 
elsif ($temp <= 72) { 
    print "Too cold!\n"; } 
else { 
    print "Temperature $temp is invalid.\n"; } 
+1

Perl是这方面的“弱类型”语言。操作人员要小心,以免受到强制(如此!)咬。 – 2011-12-12 02:49:47

回答

6

这是因为如果它不能被转换成数字,它将被视为0。您应该检查之前,如果答复只有数字,或者以任何其他方式限制输入,以便只能输入一个有效的号码。沿着线的东西:

print "invalid" if ($temp =~ /\D/); 

(打印无效的,如果$temp包含任何非数字字符请注意,这可能会使“+”和“ - ”,但你的想法)。

+0

@kurotsuki - 养成使用“严格使用”和“使用警告”的习惯;) – paulsm4

1

正是这个原因(和许多其他),你好得多,如果你启用了“使用警告”:

#!/usr/bin/perl 
    use strict; 
    use warnings; 
    ... 
2

铸造一个无效的数字串了多项成果在0,为此你可以请使用下面的内容来查看输入是否确实有效。

print "What is the temperature outside? "; 

$temp=<>; 

if ($temp == 0 && $temp ne '0') { 
    print "Temperature $temp is invalid.\n"; } 
elsif ($temp > 72) { 
    print "Too hot!\n"; } 
elsif ($temp <= 72) { 
    print "Too cold!\n"; } 

说明:如果输入字符串被铸造成0(零)虽然字符串本身不等于“0”(零)输入不是数字的,因此;无效。


你也可以检查,看看是否输入只能通过使用正则表达式包含[0-9.],这将确保它是一个有效的数字(也记得号码不以0(零)开头,然后有。随后,除非你是在八进制写数字

:记住上面的检查之前,修剪掉空格输入字符串

3

数值比较运算期待他们的论据是号码如果您尝试比较像这样的字符串使用数字比较,它将被静默地转换为数字0,该数字小于72

如果您打开了警告,您会被告知发生了什么。

friedo$ perl -Mwarnings -E 'say "foo" < 72' 
Argument "foo" isn't numeric in numeric lt (<) at -e line 1. 
1 

这就是为什么你应该总是

use strict; 
use warnings; 
0

开始你的程序删除尾部换行符,这可能是什么造成的Perl把它作为一个字符串,而不是一个号码后试试看:

chomp(my $test = <>);