2010/1/29 Dmitry E. Oboukhov <[email protected]> > On 15:39 Fri 29 Jan , Dmitry Karasik wrote: > >> Вообще-то у goto задокументирована возможность выхода из сабов. А goto > &sub > >> -- это вообще не goto, поэтому с ним тут глюки :) > > DK> более того, из нормальных сабов он это и делает - сам пользуюсь ;) > DK> а вот из обработчика сигнала - нет. > > Эмм, как это нет? я набросал модульчик и у меня делает нормально: из > обработчика alarm обратно в функцию > > my @res; > eval { > local $SIG{ALRM} = sub { > $alarmed = 1; > goto FOO_DONE; > }; > alarm $timeout; > > if ($wantarray) { > @res = eval { $code->(@args) }; > } elsif (defined $wantarray) { > $res[0] = eval { $code->(@args) }; > } else { > eval { $code->(@args) }; > } > alarm 0; > > die if $@; > }; > > FOO_DONE: > > и вот тут мы уже полностью вышли и из обработчика сигнала и из функции > которую хотели прервать. >
Он не переходит по метке, а просто умирает (и тем завершает внешний eval). Поставьте say "FAIL" прямо ПЕРЕД меткой, и всё увидете :) Тяжело тестить такую базовую вещь на модуле. Посмотрите выше по треду однострочники Монса и как они не работают.
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
