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

Konstantin S. Uvarin khedin на gmail.com
Пт Сен 13 07:16:15 PDT 2013


Приветствую.

##############
#!/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