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