2013-11-01 29 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); 
    } 
}