Почему мой терминал только позволяет мне набирать что-то, а затем код останавливается? - PullRequest
0 голосов
/ 17 октября 2019

Я попытался запустить этот скрипт, который я сделал так плохо и быстро. Может кто-нибудь указать мне правильное направление или поправить меня? Когда я запускаю скрипт, он говорит: «Что бы вы хотели сделать со своим списком покупок?»затем он позволяет мне что-то вводить, а потом просто останавливается. Обычные остановки

use Term::ANSIColor;

Menu();

sub Menu {
    print "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
    print "What would you like to do with your shopping list? \n";
    print colored("> Add Item \n", 'bold blue');
    print colored("> Look at list \n", 'bold blue');
    print colored("> Reset \n", 'bold red');
    print colored("> Quit \n", 'bold red');
    print "> ";

    my $a = <STDIN>;
    lc $a;
    chomp $a;

    if ($a == "quit") {
        open (my $fh, '>>', 'list.txt') or die "Couldn't find file!";
        while(<FH>) { 
            print $_; 
        }
        close $fh;
    } else {
        Action();
    }
}

sub Action {
    if ($a == "add" || "add item") {
        open(my $fh, '>>', 'list.txt') or die "Couldn't find file!";
        print "What would you like to add to the list?\n";
        print "> ";
        my $i = <>;
        lc $i;
        chomp $i;
        print "\n";
        print "> ";
        print FH $i;
        print 
        close $fh;
    } elsif ($a == "list" || "look at list") {
        open (my $fh, '>>', 'list.txt') or die "Couldn't find file!";
        while(<FH>) { 
            print $_; 
        } 
        close $fh;
    } elsif ($a == "reset"){
        open (my $fh, '>>', 'list.txt') or die "Couldn't find file!";
        print FH colored("Shopping list", 'bold underline');
        close $fh;
    } else {
        print "Unknown command! Try again.";
        Menu();
    }
}

1 Ответ

1 голос
/ 17 октября 2019

Perl имеет два набора операторов сравнения.

Те, которые выглядят как математические (==, !=, > и т. Д.), Выполняют числовое сравнение.

Те, которые похожи на слова (eq, ne, gt и т. Д.), Сравнивают строки.

У вас есть следующее:

if ($a == "quit") {

...

if ($a == "add" || "add item") {

...

} elsif ($a == "list" || "look at list") {

...

} elsif ($a == "reset"){

Все этиделают числовые сравнения. Вам нужно изменить все == на eq.

Кроме того, это не делает то, что вы думаете:

if ($a == "add" || "add item") {

Я думаю, вы имели в виду:

if ($a eq "add" or $a eq "add item") {

Кроме того, $a - это специальная переменная в Perl. Пожалуйста, не используйте его в общем коде. Имя переменной важно. Ваша переменная должна называться $action.

Обновление: Стоит также указать, что если в вашем коде было use warnings (и вы должны всегда включатьuse warnings в вашем Perl-коде), тогда вы бы увидели предупреждения о том, что с вашим кодом возникла проблема.

$ perl -Mwarnings -e'$action = "x"; print "yes" if $action == "quit"'
Argument "quit" isn't numeric in numeric eq (==) at -e line 1.
Argument "x" isn't numeric in numeric eq (==) at -e line 1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...