2010/1/29 Mons Anderson <[email protected]>

> On Friday 29 January 2010 16:38:12 Dmitry E. Oboukhov wrote:
> > Хехе :) вот Ромка рядом сидит может подтвердить. мы с утра первое что
> > попробовали это goto :)
> >
> > реально goto заменит саму sub что в SIG{ALRM} на то что мы вызовем, а
> > там нам надо делать что? return или die.
> > стек в этой функции показывает на прерванный eval.
> >
> > ретурн - вернет в eval
> > die - будет пойман eval'ом
> >
> > а вернуть управление надо в вызвавшую нас функцию.
> > то есть goto "удаляет" упоминание о функции SIGALRM, то есть удаляет 1
> > вызов с вершины стека, а удалить надо еще несколько функций
>
> можно использовать "плохой" goto ;)
>
> perl -E 'sub foo { eval "sleep 10" } { local $SIG{ALRM} = sub { goto EXIT;
> };
> alarm 1; foo(); EXIT: alarm 0; say "exited" }'
>

Ну и не работает :)
В смысле выполнение прерывается, а goto не срабатывает и перехода на метку
не происходит. "exited" выводится, потому что say стоит после foo().

Если убрать eval из foo(), то (а в отсутствие die он не нужен), то
появляется сообщение о попытке перехода на несуществующую метку.

perl -E 'sub foo { sleep 10 } { local $SIG{ALRM} = sub { goto EXIT; }; alarm
1; foo(); EXIT: alarm 0; say "exited" }'
--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить