[Moscow.pm] Волшебный баг с AnyEvent::postpone
Mons Anderson
v.perepelitsa на corp.mail.ru
Пт Сен 13 07:45:34 PDT 2013
Т.к. вы не делали use AnyEvent (require in compile time), то вы не получили прототип функции AE::postpone
соответственно писать
AE::cv { … }
или
AE::postpone { … }
не имеете права.
On 13.09.2013, at 18:16, "Konstantin S. Uvarin" <khedin на 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 на pm.org | http://moscow.pm.org
Подробная информация о списке рассылки Moscow-pm