2012-06-29 97 views
3

我想在perl中編寫一個腳本來爲變量「10」定義一個值。 然後,它會要求用戶通過STDIN爲該變量輸入值。 如果用戶在固定的TIME INTERVAL內輸入數值,那麼取這個值,否則通過採用默認值10來繼續該程序。減少變量的值隨着時間的變化

我不知道該怎麼做。我想到了一些像這樣的東西.. $ t = 120(120秒) 每秒鐘減少「$ t」的值,如果用戶輸入一些值 然後從循環中出來並繼續,否則當$ t變爲0,取默認值並繼續。 但是,我沒有任何想法如何隨着時間減少變量的值,並要求用戶輸入。

我可以做到這一點,隨着時間的推移減少變量的價值,但在此之內,我無法接受輸入。

+1

你應該設置一個超時信號。閱讀這篇相關的文章:http://stackoverflow.com/questions/2423288/ways-to-do-timeouts-in-perl關心, – user1126070

回答

4

下面是一個簡單的例子,告訴您如何使用報警信號。

use strict; 
use warnings; 

my $input = eval { 
    my $tmp; 

    # this sub will be called after the timeout set by the alarm below 
    local $SIG{ALRM} = sub { 
     print "timeout - using default value 10\n"; 
     $tmp = 10; 
    }; 

    print "enter input: "; 
    alarm 10; # wait for 10 secs 
    $tmp = <>; 
    alarm 0;  # turn off alarm if we got input within 10 secs 
    $tmp; 
}; 

print "the value is: $input\n"; 
+0

爲什麼評估必要?沒有什麼'死()'。 – pilcrow

+0

這是真的;只是在寫報警時的習慣習慣。 – friedo

+0

這不起作用。 Perl會*重新啓動*中斷的讀取,這意味着即使在'alarm()'觸發後也需要一行輸入來提前執行。 (我懷疑你評估這種「習慣」的原因是因爲一種正確的技術是在ALRM處理程序中'死掉',避免重新啓動。)如果你將'$ tmp'設置爲數字以外的數字你的ALRM處理程序(例如'$ tmp =「timeout」'),你會發現這個技術根本不起作用。它似乎與數字賦值一起工作的原因是[棘手的bug](https://rt.perl.org/rt3/Public/Bug/Display.html?id=113906)。 – pilcrow

1

可以做到這一點與IO ::選擇

use strict; 
use IO::Select; 

my $value = 10; 
my $obj = IO::Select->new(\*STDIN); 
foreach my $hand ($obj->can_read(2)) { 
    $value = <$hand> ; 
} 
print "value is :$value:\n" ;