2012-06-29 66 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" ;