<div class="gmail_quote">2010/1/29 Mons Anderson <span dir="ltr">&lt;<a href="mailto:mons@cpan.org">mons@cpan.org</a>&gt;</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>
&gt; Хехе :) вот Ромка рядом сидит может подтвердить. мы с утра первое что<br>
&gt; попробовали это goto :)<br>
&gt;<br>
&gt; реально goto заменит саму sub что в SIG{ALRM} на то что мы вызовем, а<br>
&gt; там нам надо делать что? return или die.<br>
&gt; стек в этой функции показывает на прерванный eval.<br>
&gt;<br>
&gt; ретурн - вернет в eval<br>
&gt; die - будет пойман eval&#39;ом<br>
&gt;<br>
&gt; а вернуть управление надо в вызвавшую нас функцию.<br>
&gt; то есть goto &quot;удаляет&quot; упоминание о функции SIGALRM, то есть удаляет 1<br>
&gt; вызов с вершины стека, а удалить надо еще несколько функций<br>
<br>
</div>можно использовать &quot;плохой&quot; goto ;)<br>
<br>
perl -E &#39;sub foo { eval &quot;sleep 10&quot; } { local $SIG{ALRM} = sub { goto EXIT; };<br>
alarm 1; foo(); EXIT: alarm 0; say &quot;exited&quot; }&#39;<br></blockquote><div><br></div><div>Ну и не работает :)</div><div>В смысле выполнение прерывается, а goto не срабатывает и перехода на метку не происходит. &quot;exited&quot; выводится, потому что say стоит после foo().</div>

<div><br></div><div>Если убрать eval из foo(), то (а в отсутствие die он не нужен), то появляется сообщение о попытке перехода на несуществующую метку.</div><div><br></div><div>perl -E &#39;sub foo { sleep 10 } { local $SIG{ALRM} = sub { goto EXIT; }; alarm 1; foo(); EXIT: alarm 0; say &quot;exited&quot; }&#39;</div>

</div>