Неожиданный результат для оператора IF: "string" <= 72 - правда? - PullRequest
0 голосов
/ 12 декабря 2011

В моем коде ниже, когда я ввожу несколько нецифровых букв на входе (т.е. $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 ]

6 голосов
/ 12 декабря 2011

Это потому, что он будет рассматриваться как 0, если он не может быть преобразован в число.Прежде чем проверять, есть ли в ответе только цифры, следует либо ограничить ввод, либо вводить только действительный номер.Что-то вроде следующего:

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

(печатает недопустимо, если $temp содержит любой нецифровый символ. Обратите внимание, что это может сделать недействительными "+" и "-", но вы поймете, что идея).

3 голосов
/ 12 декабря 2011

Операторы числового сравнения ожидают, что их аргументы будут числами. Если вы попытаетесь сравнить строку типа '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 голосов
/ 12 декабря 2011

Преобразование неверной числовой строки в число приводит к 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 (нуля), а затем имеют цифры, которые следуйте, если вы не пишете в восьмеричном.

Примечание : не забудьте обрезать входную строку из пробелов перед проверкой выше.

1 голос
/ 12 декабря 2011

Именно по этой причине (и многим другим) вам НАМНОГО лучше, если вы включите "использовать предупреждения":

#!/usr/bin/perl
    use strict;
    use warnings;
    ...
0 голосов
/ 12 декабря 2011

Попробуйте после удаления завершающего символа новой строки, что, вероятно, заставляет Perl рассматривать его как строку, а не число:

chomp( my $test = <> );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...