Perl: eval таймер в то время как

Я пытаюсь создать таймер с несколькими циклами, как показано ниже.

while ( $try < 3) {
    eval {
        local $SIG{ALRM} = {};
        alarm 3;
        $ret = # sending request and wait for response
        alarm 0;
    }
    last if defined($ret);
    $try++;
}

Но на самом деле, когда тревога истечет, весь цикл while прервется, и цикла вообще не будет.

Где я ошибся?


person Yang    schedule 20.03.2014    source источник


Ответы (1)


Вам необходимо установить обработчик ALRM, как показано в документации alarm:

for (1..3) {    
    print "Loop $_\n";

    eval {
        local $SIG{ALRM} = sub { die "alarm\n" };
        alarm 5;

        my $count = int rand 10;
        print "Is $count < 5?\n"; 
        sleep $count;

        alarm 0; #cancel the alarm if does not hang
    };

    if ($@) {
        die unless $@ eq "alarm\n";   # propagate unexpected errors
    } else {
        print "Our code succeeded\n";
        last;
    }
}
person Miller    schedule 20.03.2014
comment
Сначала я написал обработчик, но он тоже не работал. Я попробую еще раз. - person Yang; 20.03.2014
comment
То, что я продемонстрировал, должно работать нормально. Можно даже просто скопировать/вставить это в скрипт, чтобы подтвердить, прежде чем пытаться интегрировать его в свой код. - person Miller; 20.03.2014
comment
Да, спасибо. Я использовал тайм-аут\n вместо будильника\n. После того, как я переключился на будильник\n, все работает. Спасибо. Так что для меня тупой сигнал тревоги\n выглядит довольно исправленным. - person Yang; 20.03.2014
comment
En, не совсем так с 'alarm\n'. Я обнаружил, что '$@' в моем случае не определен, поэтому, когда я пытался проверить вывод исключения, оно всегда умирало. Я предполагаю, что в моем контексте (какой-то суперкласс или что-то еще) в то же время выдается некоторый вывод, чтобы сделать «$@» неопределенным. - person Yang; 20.03.2014