<div class="gmail_quote">2010/1/29 Dmitry E. Oboukhov <span dir="ltr">&lt;<a href="mailto:unera@debian.org">unera@debian.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 15:39 Fri 29 Jan     , Dmitry Karasik wrote:<br>
&gt;&gt; Вообще-то у goto задокументирована возможность выхода из сабов. А goto &amp;sub<br>
&gt;&gt; -- это вообще не goto, поэтому с ним тут глюки :)<br>
<br>
</div>DK&gt; более того, из нормальных сабов он это и делает - сам пользуюсь ;)<br>
DK&gt; а вот из обработчика сигнала - нет.<br>
<br>
Эмм, как это нет? я набросал модульчик и у меня делает нормально: из<br>
обработчика alarm обратно в функцию<br>
<br>
    my @res;<br>
<div class="im">    eval {<br>
        local $SIG{ALRM} = sub {<br>
</div>            $alarmed = 1;<br>
            goto FOO_DONE;<br>
        };<br>
        alarm $timeout;<br>
<br>
        if ($wantarray) {<br>
            @res = eval { $code-&gt;(@args) };<br>
        } elsif (defined $wantarray) {<br>
            $res[0] = eval { $code-&gt;(@args) };<br>
        } else {<br>
            eval { $code-&gt;(@args) };<br>
        }<br>
        alarm 0;<br>
<br>
        die if $@;<br>
    };<br>
<br>
    FOO_DONE:<br>
<br>
    и вот тут мы уже полностью вышли и из обработчика сигнала и из функции<br>
которую хотели прервать.<br></blockquote><div><br></div><div>Он не переходит по метке, а просто умирает (и тем завершает внешний eval). Поставьте say &quot;FAIL&quot; прямо ПЕРЕД меткой, и всё увидете :)</div><div><br></div>

<div>Тяжело тестить такую базовую вещь на модуле. Посмотрите выше по треду однострочники Монса и как они не работают.</div><div><br></div></div>