倒数计时器在某些时间停止并要求输入

时间:2014-09-21 18:00:10

标签: perl loops countdown

我正在上课的项目要求我在60点开始计数器倒计时(打印每个数字),但是计数器需要以10秒的间隔停止并询问用户输入。我让该程序的一部分以"密码"的形式工作。我遇到问题的地方是让我的子程序一起工作以获得我想要它做的事情。这是我到目前为止所拥有的。

print "Enter password: ";
my $password = <STDIN>;
chomp($password);

if ( $password eq "password" ) {
    &counter;
} else {
    print "bad";
}

sub counter {
    our $countdown = 60;

    while ( $countdown > 0 ) {
        $countdown--;
        &check;
        print "$countdown\n";
    }
}

sub check {
    if ( our $countdown = ( 50, 40, 30, 20, 10 ) ) {
        print "Enter password: ";
        my $password = <STDIN>;
        chomp($password);
    }
    if ( $password eq "password" ) {
        &counter;
    } else {
        print "bad";
    }
}

1 个答案:

答案 0 :(得分:1)

PythonMaster的答案没问题,只是忽略了这是一个 Perl 问题。

$|++;  # unbuffered output
my $counter = 60;
my $passed;
while ($counter) {
    $counter--;
    print "$counter...\cm";
    if ( not $counter % 10 ) {
        last if $passed = check();
    }
    sleep 1;
}
print "\n";
print "All password attempts failed!\n" unless $passed;

sub check {
    print "\nEnter password: ";
    my $password = <STDIN>;
    chomp($password);
    return  $password eq "password";
}

注意:

    如果标准输出为非零值,则
  • $|取消标准输出。由于我们希望看到倒计时输出,我们需要解除STDOUT缓冲。
  • 关键位是使用模运算符来决定我们何时处于10的倍数(当模数为真时模数为零;因为零是Perl中的'false'值,我们not表示得到一个在模数为零时为真的表达式。
  • check()被简化为简单地返回比较结果。如果是,则函数返回true值,否则返回false。
  • last if $passed = check()执行三重任务:如果检查密码,则保存该值,如果密码正常则结束循环。
  • 额外的"\n"字符用于将密码提示删除到下一行,并确保最终的“失败”消息显示在其自己的行上。
  • "\cm"使倒计时保持在同一行,直到出现密码提示。

编辑:上面评论中链接的解决方案很多比此更好。