2011-12-12 52 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 = <>);