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

Mons Anderson mons на cpan.org
Пт Сен 13 07:48:07 PDT 2013


Ах, ну да:

http://perldoc.perl.org/perlsub.html#Prototypes

читать до наступления просветления )


cmp:

sub foo { say "@_" }
vs
sub foo(&) { say "@_" }

foo {  };


2013/9/13 Mons Anderson <mons на cpan.org>:
> Т.к. вы не делали 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
>



-- 
Best wishes,
Vladimir V. Perepelitsa aka Mons Anderson
<inthrax на gmail.com>, <mons на cpan.org>
http://github.com/Mons


Подробная информация о списке рассылки Moscow-pm