2013-11-01 27 views
0

我对Perl很新,这是我第一篇文章,所以要温和。如何在Perl中暂停实时

我在60秒的倒数计时器中使用实时时钟,并且需要能够每隔10秒停止一次,然后用户必须输入是否要在每个10的间隔时间内继续倒计时。定时器工作,我只是不知道如何暂停它,供用户输入他们的回应。尽可能地回答基本问题将会非常受欢迎,因为我还没有太多的了解。谢谢,到目前为止,这里是我的代码。

my $countdown = 1*60; #60 seconds 
$| = 1; #disable output buffering 

my $start_time = time; 
my $end_time = $start_time + $countdown; 


for (;;) { 
    my $time = time; 
    last if ($time >= $end_time); 
    printf("\r%02d:%02d:%02d", 
     ($end_time - $time)/(1*60), 
     ($end_time - $time)/60%60, 
     ($end_time - $time) % 60, 
    ); 

    sleep(1); 
} 
+1

'$ input = <>;'将等待来自用户的输入。 – Barmar

+0

在循环中使用10秒定时器执行6次。 – ikegami

+0

每循环一次减少'$ countdown'。用户回答提示后,使用当前时间和$ countdown的值重新计算'$ end_time'。 – Barmar

回答

2

更新$end_time得到用户的回应后。

while (1) { 
    $countdown--; 
    $time = time; 
    last if ($time >= $end_time); 
    printf("\r%02d:%02d:%02d", 
     ($end_time - $time)/(1*60), 
     ($end_time - $time)/60%60, 
     ($end_time - $time) % 60, 
    ); 

    sleep(1); 
    if ($countdown%10 == 0) { 
     print "Continue? "; 
     $answer = <>; 
     chomp $answer; 
     last if $answer ne 'y'; 
     $end_time = time + $countdown; 
    } 
} 
+0

这可能会阻止程序,但不会暂停计时器。 – ikegami

+0

他的代码中没有计时器,他只是倒计时并在每次迭代之间睡1秒。 – Barmar

+0

如果您需要10秒钟才能回答,程序将运行60秒。如果您花20秒钟的时间回答,程序将运行60秒。这不会暂停计时器,除非您花费超过10秒来回答最后一个问题。 – ikegami

1

在循环中使用10秒倒计时执行6次。

for my $i (1..6) { 
    if ($i != 1) { 
     print "\nContinue? "; 
     $answer = <>; 
     chomp $answer; 
     last if !($answer eq 'y' || $answer eq 'yes'); 
    } 

    countdown(10); 
} 

其中countdown只是您发布的代码。

sub countdown { 
    my ($length) = @_; 

    my $start_time = time; 
    my $end_time = $start_time + $length; 
    for (;;) { 
     my $time = time; 
     last if $time >= $end_time; 
     printf("\r%02d:%02d:%02d", 
      ($end_time - $time)/(1*60), 
      ($end_time - $time)/60%60, 
      ($end_time - $time) % 60, 
     ); 

     sleep(1); 
    } 
}