2012-06-29 4 views
3

Я хочу написать скрипт в perl, который определит значение переменной say «10». Затем он попросит пользователя ввести значение через STDIN для этой переменной. Если пользователь вводит значение в пределах фиксированного интервала времени, то принимайте это значение, иначе продолжайте программу, приняв это значение по умолчанию 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

Зачем нужна оценка? Ничего 'die()' s. – pilcrow

+0

Это правда; просто сила-привычка при написании тревог, я думаю. – friedo

+0

Это не работает. Perl будет * перезапускать * прерванное чтение, то есть строка ввода требуется для ускорения выполнения даже после срабатывания 'alarm()'. (Я подозреваю, что причина, по которой вы «выходите» из этого «из привычки», состоит в том, что одна правильная техника - «умереть» в обработчике ALRM, избегая перезапуска.) Если вы установите '$ tmp' на нечто, отличное от числа в ваш обработчик ALRM (например, '$ tmp =" timeout "'), вы увидите, что этот метод не работает вообще. Причина, по которой она работает с числовым назначением, связана с [тернистой ошибкой] (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" ;