[Moscow.pm] Волшебный баг с AnyEvent::postpone
Konstantin S. Uvarin
khedin на gmail.com
Пт Сен 13 08:48:31 PDT 2013
Приветствую.
>не получили прототип
>не имеете права
Это-то я понимаю. Меня, скорее, удивило, ЧТО происходит в отсутствие
прототипа. Ну и то, что AnyEvent это проглотил и не сказал не слова (на
самом деле он ловит unhandled exception в event loop, когда пытается
выполнить "результат code"->(). Но пользователь об этом не факт что
узнает.).
Вообще я был бы рад, если бы из нижеприведённого корректным кодом был
бы только вариант с прототипом.
perl -wle 'foo{ 3 => print "xx" }; sub foo { print shift }'
perl -wle 'sub foo; foo{ 3 => print "xx" }; sub foo { print shift }'
perl -wle 'sub foo(&); foo{ 3 => print "xx" }; sub foo (&) { print
shift }'
On Fri, 2013-09-13 at 18:45 +0400, Mons Anderson wrote:
> Т.к. вы не делали use AnyEvent (require in compile time), то вы не получили прототип функции AE::postpone
> соответственно писать
>
> AE::cv { … }
> или
> AE::postpone { … }
>
> не имеете права.
>
> On 13.09.2013, at 18:16, "Konstantin S. Uvarin" <khedin at gmail.com> wrote:
>
> > Приветствую.
> >
> > ##############
> > #!/usr/bin/perl -w
> >
> > use strict;
> > require AnyEvent; # not use
> >
> > my $cv = AnyEvent->condvar;
> > print 1;
> > AnyEvent::postpone{ print 3; $cv->send; };
> > print 2;
> > $cv->recv;
> > print 4;
> > ##############
> >
> > perl script.pl выводит 1324.
> >
> > Т.е. код, который postpone ("выполнить на следующем витке event loop"),
> > на самом деле выполняется прямо сейчас.
> >
> > Если require заменить на use (или просто perl -MAnyEvent script.pl), всё
> > нормально: 1234.
> >
> > Или если написать AnyEvent::postpone( sub { ... } ); (так, видимо, и
> > сделаем, т.к. не хотим грузить AE в BEGIN-е).
> >
> > Такое ощущение, что foo{ code; } трактуется как "вызвать foo( результат
> > code )". Почему так?
> >
> > Я ожидал чего-то такого:
> >
> > perl -we 'sub foo{ print shift }; foo{ print 2 };'
> > Odd number of elements in anonymous hash at -e line 1.
> > 2HASH(0x91ff7ec)
> >
> > А, да, perl 5.14.2 (linux) и 5.14.4 (freebsd)
> >
> > --
> > Konstantin S. Uvarin
> >
> >
> > --
> > Moscow.pm mailing list
> > moscow-pm at pm.org | http://moscow.pm.org
>
Подробная информация о списке рассылки Moscow-pm