Условное утверждение, дающее, казалось бы, неправильный ответ: чего мне не хватает - PullRequest
3 голосов
/ 06 апреля 2011

Итак, я должен сделать простой калькулятор на Perl, который поддерживает аккумулятор и выполняет простые операции. Аккумулятор начинается с 0, а затем изменяется в зависимости от результатов, которые я получаю. На данный момент я только пытаюсь получить дополнение к работе. Когда я проверяю, чтобы убедиться, что введенный оператор + что-то идет не так. Например:

Аккумулятор: 0
Оператор: Все, что здесь указано, приводит к дополнительному результату. Включая это предложение.
Операнд: 4

Аккумулятор: 4

Он ловит цифры, но больше ничего. Я попытался использовать grep и список операторов. Я исчерпал все свои идеи. Вот мой код (Fyi первый пост, поэтому помогите мне с любыми ошибками noob):

my $running = 1;
my $accum = "0";
my $operator;
my $operand;

print("Welcome to the simple, command line calculator.\n");
print("To terminate, press Control-C.\n\n");

while ($running){

    print("\nAccumulator: ".$accum."\n");
    print("Operator: ");
    $operator = <STDIN>;
    if ($operator == "+"){
            print("Operand: ");
            operand = <STDIN>;
            $accum += $operand;
    }
    else{
        print("Invalid operator: ".$operator."\n");
    }
}

Ответы [ 2 ]

13 голосов
/ 06 апреля 2011

Perl не удаляет завершающий символ новой строки из ввода, если вы не используете опцию -l, поэтому вы сравниваете "+" с "+\n". Обычно вы хотите сделать что-то вроде chomp($operator);.

Тем не менее, ваша реальная проблема заключается в том, что == выполняет числовое сравнение, а "+" и "+\n" оцениваются в 0 в числовом контексте. (Использование -w, как вы должны всегда делать, предупредит вас об этом.) Используйте оператор eq для сравнения строк.

3 голосов
/ 06 апреля 2011

== сравнивает числа, а не строки.Если вы сравниваете строки, строки будут преобразованы в числа;для нечисловых строк это означает, что они становятся 0.Таким образом, $operator == "+" становится 0 == 0.

. Для строк используйте eq.Кроме того, имейте в виду, что <STDIN> сохранит переводы строки;убедитесь, что chomp $operator также.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...