[Moscow.pm] Волшебный баг с AnyEvent::postpone

Mons Anderson mons на cpan.org
Пт Сен 13 07:45:50 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