0

我正在尝试制作一个模拟杂货店故事线的程序。如果输入 a,它允许用户添加名称。如果输入 c,它会模拟一个人离开线路。如果输入 p,它会打印名称列表。如果输入 q,则退出。

我的代码只会导致无限循环,我不知道为什么。每次我尝试输入值时,它只会读取无效输入并且不会退出。我不确定其他东西是否有效,但这不是我需要帮助的。

    $choice="";
    $name;
    @line=();
    print "\n";
    print "Choose an option:\n";
    print "a: Add person to end of line\n";
    print "c: Call the next person in line\n";
    print "p: Print the list of people in line\n";
    print "q: Quit\n";
    print "\n";

    while ($choice ne "q") {

    print "Your choice:";
    $choice = <>;
    print "\n";

    if($choice eq "a") {
            print "Enter name:";
            $name = <>;
            push(@line,$name);
    }
    elsif ($choice eq "c") {
    shift(@line);
    }
    elsif ($choice eq "p") {
            for ($i=0;$i<=scalar(@line);$i++) {
                    print (@line[$i]);
            }
    }
    elsif ($choice eq "q") {
            exit;
    }
    else {
            print "Invalid option";
    }

    }
4

3 回答 3

4

正如@stark 正确指出的那样,循环的主要问题是您在从STDIN 获取输入后没有删除换行符。所以,$choice 永远不会匹配你的选项,你也永远不会跳出循环。尝试改变:

print "Your choice:";
$choice = <>;

print "Your choice:"; 
$choice = <STDIN>; 
chomp $choice;

请注意,chomp $choice在进行字符串比较之前,您需要删除换行符。

此外,尝试使用“使用警告”和“使用严格”来编写脚本。这会发现很多你可能没有注意到的小错误。例如,您的脚本可能如下所示:

#!/usr/bin/env perl
use strict; 
use warnings; 

my $choice = ""; 
my $name; 
my @line = (); 
print "\n"; 
print "Choose an option:\n"; 
print "a: Add person to end of line\n"; 
print "c: Call the next person in line\n"; 
print "p: Print the list of people in line\n"; 
print "q: Quit\n"; 
print "\n"; 

while ( $choice ne "q" ) { 

    print "Your choice:"; 
    $choice = <STDIN>; 
    chomp $choice; 
    print "\n"; 

    if ( $choice eq "a" ) { 
        print "Enter name:"; 
        $name = <>; 
        push( @line, $name ); 
    } 
    elsif ( $choice eq "c" ) { 
        shift( @line ); 
    } 
    elsif ( $choice eq "p" ) { 
        for ( my $i = 0; $i <= scalar( @line ); $i++ ) { 
            print( $line[$i] ); 
        } 
    } 
    elsif ( $choice eq "q" ) { 
        exit; 
    } 
    else { 
        print "Invalid option"; 
    } 

}
于 2012-04-19T04:29:31.840 回答
1

“<>”函数返回一行输入,而不是一个字符。您需要在最后删除换行符。

于 2012-04-19T04:26:56.307 回答
1

chomp是个好主意,但有时还不够。这是input,因此有时您需要广泛接受的模式。如其他两篇文章所示,您的模式太窄,不允许输入末尾的行尾字符。

但是,之后的角色不是有多余的空格,差不多吗?所以也许你想这样做:

my $line = <>;
my ( $choice ) = $line =~ m/^\s*([acqp])\s*$/;

如果你想接受这两种情况的字母,你可以简单地i在匹配表达式 ( ) 的末尾添加一个标志m//,可能还有一个 map 命令来lc(小写)结果:

my $line = <>;
my ( $choice ) = map {; lc } $line =~ m/^\s*([acqp])\s*$/i;

您还可以决定不关心胖手指,并像这样进行匹配表达式:

m/^\s*([acqp])(?:\W.*)?$/i

这意味着在换行符之前至少有一个非单词字符(如果有的话)。

我对输入进行广泛接受。这是我的一个应用程序中的日期输入字段中没有人会生气的原因。例如,我的日期字段不会试图假装他们无法确定日期表达式,除非您包含前导 0 或遵循某些 MM/DD 模式。(并且 1 到 31 之间的单个数字默认为当前月份或最近一个月或下个月,具体取决于日期逻辑(报告?计划?)以及当月过去或离开的日期)。只是关于输入的建议,仅此而已。

于 2012-04-19T05:50:46.190 回答