[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