Проблема с оператором goto вместе с условием if else - PullRequest
1 голос
/ 11 марта 2020

Я пытаюсь создать простое perl назначение для проверки на равенство и концепции метки перехода.
Пользователь вводит числа, проверка на равенство происходит, пользователя спрашивают, хотят ли они проверить больше, если да, то это повторяется, иначе это выходит. Использование «goto» для этого
Issue-y / n проверяет повторение, y - повторение Label. даже если я введу «n», он продолжит идти к метке L oop. Почему условие «если», содержащее «goto», не выполняется? Код ниже

#Checking Equality

Loop: print "\Checking Equality\n";
print "Enter number for variable a\n";
$a = <stdin>;
print "Enter number for variable b\n";
$b = <stdin>;
if ( $a == $b ) {
    print 'a and b are equal';
    print "\n\n";
}
else {
    print 'a and b are not equal';
}
print "\n\n";
print "do you want to check more? Enter y/n\n";
$c = <stdin>;
if ( $c == "y" ) {
    goto Loop;
}
elsif ( $c == "n" ) {
    print "Exiting\n";
}

Выход-

Checking Equality
Enter number for variable a
3
Enter number for variable b
4
a and b are not equal

do you want to check more? Enter y/n
n         
Checking Equality   #### despite of entering n goto Loop is getting executed
Enter number for variable a

Ответы [ 2 ]

5 голосов
/ 11 марта 2020

Просто используйте функцию chomp , чтобы удалить переводы строк, и используйте eq сравнение для строки.

use strict;
use warnings;

Loop: print "\nChecking Equality\n";
print "Enter number for variable a\n";
my $a = <stdin>;
print "Enter number for variable b\n";
my $b = <stdin>;
if ( $a == $b ) {
    print 'a and b are equal';
    print "\n\n";
}
else {
    print 'a and b are not equal';
}
print "\n\n";
print "do you want to check more? Enter y/n\n";

chomp(my $c = <stdin>);

if ( $c eq "y" ) {
    goto Loop;
}
else {
    print "Exiting\n";
}
0 голосов
/ 12 марта 2020

Вы выбрали не лучший способ использовать метку для goto.

Вместо этого l oop будет более подходящим для выполнения пользовательского ввода. Пользователь остается в l oop до тех пор, пока он / она не укажет, что он / она готов уйти.

Пользовательский ввод также должен быть удален с символа новой строки \n, прежде чем его можно будет использовать для сравнения.

Поскольку пользователь предполагает вводить данные несколько раз, было бы целесообразно использовать небольшую подпрограмму для печати «подсказки ввода», сбора ввода, удаления символа новой строки и возврата значения ввода. Таким образом, программа становится короче и легче для чтения.

Операция сравнения строк выполняется с eq, сравнение чисел с ==.

use strict;
use warnings;
use feature 'say';

my $answer = 'y';

while( $answer eq 'y' ) {
    my $num_1 = get_input('Enter variable num_1: ');
    my $num_2 = get_input('Enter variable num_2: ');

    my $compare = $num_1 == $num_2 ? 'EQUIAL' : 'NOT EQUIAL';

    say "\nNumbers are $compare\n";

    $answer = get_input('Would you like to continue? (y/n) ');
    $answer = lc $answer;
    say '-' x 35;
}

sub get_input {
    my $msg = shift;
    my $input;

    print $msg;
    $input = <>;
    chomp $input;

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