<div class="gmail_quote">2010/1/29 Mons Anderson <span dir="ltr"><<a href="mailto:mons@cpan.org">mons@cpan.org</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Friday 29 January 2010 16:38:12 Dmitry E. Oboukhov wrote:<br>
> Хехе :) вот Ромка рядом сидит может подтвердить. мы с утра первое что<br>
> попробовали это goto :)<br>
><br>
> реально goto заменит саму sub что в SIG{ALRM} на то что мы вызовем, а<br>
> там нам надо делать что? return или die.<br>
> стек в этой функции показывает на прерванный eval.<br>
><br>
> ретурн - вернет в eval<br>
> die - будет пойман eval'ом<br>
><br>
> а вернуть управление надо в вызвавшую нас функцию.<br>
> то есть goto "удаляет" упоминание о функции SIGALRM, то есть удаляет 1<br>
> вызов с вершины стека, а удалить надо еще несколько функций<br>
<br>
</div>можно использовать "плохой" goto ;)<br>
<br>
perl -E 'sub foo { eval "sleep 10" } { local $SIG{ALRM} = sub { goto EXIT; };<br>
alarm 1; foo(); EXIT: alarm 0; say "exited" }'<br></blockquote><div><br></div><div>Ну и не работает :)</div><div>В смысле выполнение прерывается, а goto не срабатывает и перехода на метку не происходит. "exited" выводится, потому что say стоит после foo().</div>
<div><br></div><div>Если убрать eval из foo(), то (а в отсутствие die он не нужен), то появляется сообщение о попытке перехода на несуществующую метку.</div><div><br></div><div>perl -E 'sub foo { sleep 10 } { local $SIG{ALRM} = sub { goto EXIT; }; alarm 1; foo(); EXIT: alarm 0; say "exited" }'</div>
</div>