在我的下面的代码中,当我在输入处输入一些非数字字母(即$temp
)时,它会回答“太冷!”而不是“无效”。我错过了什么?
#!/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"; }
答案 0 :(得分:6)
这是因为如果无法将其转换为数字,则将其视为0。您应该先检查响应是否只有数字,或者以任何其他方式限制输入,以便只输入有效数字。一些事情:
print "invalid" if ($temp =~ /\D/);
(如果$temp
包含任何非数字字符,则打印无效。请注意,这可能会使“+”和“ - ”无效,但您明白了。
答案 1 :(得分:3)
数值比较运算符期望它们的参数是数字。如果您尝试使用数字比较来比较'foo'
之类的字符串,则会将其静默转换为数字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;
答案 2 :(得分: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 :(得分:1)
正是出于这个原因(以及其他许多原因),如果你启用“使用警告”,你的情况会好一些:
#!/usr/bin/perl
use strict;
use warnings;
...
答案 4 :(得分:0)
在删除尾随换行符后尝试一下,这可能是导致Perl将其视为字符串而不是数字的原因:
chomp( my $test = <> );