Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 让倒计时计时器在特定时间停止并请求输入_Perl_Loops_Countdown - Fatal编程技术网

Perl 让倒计时计时器在特定时间停止并请求输入

Perl 让倒计时计时器在特定时间停止并请求输入,perl,loops,countdown,Perl,Loops,Countdown,我正在为班级做的一个项目希望我在60开始计数(打印每个数字),但计数器需要每隔10秒停止并请求用户输入。我让程序的这一部分以“密码”的形式工作。我遇到的问题是让我的子例程一起工作以得到我想要它做的事情。这是我到目前为止所拥有的 打印“输入密码”:; 我的$password=; chomp($password); if($password eq“password”){ &计数器; }否则{ 打印“坏”; } 副计数器{ 我们的美元倒计时=60; 而($countdown>0){ $倒计时--; &

我正在为班级做的一个项目希望我在60开始计数(打印每个数字),但计数器需要每隔10秒停止并请求用户输入。我让程序的这一部分以“密码”的形式工作。我遇到的问题是让我的子例程一起工作以得到我想要它做的事情。这是我到目前为止所拥有的

打印“输入密码”:;
我的$password=;
chomp($password);
if($password eq“password”){
&计数器;
}否则{
打印“坏”;
}
副计数器{
我们的美元倒计时=60;
而($countdown>0){
$倒计时--;
&检查;
打印“$countdown\n”;
}
}
次级支票{
如果(我们的美元倒计时=(50,40,30,20,10)){
打印“输入密码:”;
我的$password=;
chomp($password);
}
如果($password eq“password”){
&计数器;
}否则{
打印“坏”;
}
}

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";
}
$|+++#无缓冲输出
我的$counter=60;
我的美元过去了;
while($counter){
$counter--;
打印“$counter…\cm”;
如果(不是$counter%10){
如果$passed=check(),则为last;
}
睡眠1;
}
打印“\n”;
打印“所有密码尝试均失败!\n”,除非$passed;
次级支票{
打印“\n输入密码:”;
我的$password=;
chomp($password);
返回$password eq“password”;
}
注:

  • $|
    如果标准输出为非零值,则取消缓冲。因为我们希望看到倒计时输出,所以我们需要取消缓冲STDOUT
  • 关键点是使用模运算符来决定何时为10的倍数(如果为真,则模为零;因为在Perl中,零是一个“假”值,所以我们
    而不是
    以获得当模为零时为真的表达式
  • check()
    简化为只返回比较结果。如果为真,则函数返回真值,否则返回假值
  • last if$passed=check()
    执行三重任务:如果检查密码,则保存值,如果密码正确,则结束循环
  • 额外的
    “\n”
    字符用于将密码提示放到下一行,并确保最后一条“失败”消息出现在它自己的行上
  • “\cm”
    使倒计时保持在同一行,直到出现密码提示
编辑:上面评论中链接到的解决方案比这个要好得多。

请参见