IF语句的意外结果:“string”< = 72是真的吗?

时间:2011-12-12 00:56:37

标签: perl

在我的下面的代码中,当我在输入处输入一些非数字字母(即$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"; }

5 个答案:

答案 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 = <> );