上下文
这是一个perl测试脚本,我想看看如何在AnyEvent中使用特定的事件循环:
# file test.pl :
#!/usr/bin/perl
use strict;
use warnings;
use AnyEvent;
use AnyEvent::Impl::EV;
my $cv = AnyEvent->condvar;
my $wait_one_and_a_half_seconds = AnyEvent->timer (
after => 0.5, # after how many seconds to invoke the cb?
cb => sub { # the callback to invoke
print ("Hello from callback\n");
$cv->send;
},
);
# now wait till our time has come
$cv->recv;
问题
以下是运行上述代码时出现的错误:
$perl test.pl
Can't locate EV.pm in @INC (you may need to install the EV module) (@INC
contains: /etc/perl /usr/local/lib/perl/5.18.2 /usr/local/share/perl/5.18.2
/usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.18 /usr/share/perl/5.18
/usr/local/lib/site_perl .) at /usr/local/lib/perl/5.18.2/AnyEvent/Impl/EV.pm
line 28.
BEGIN failed--compilation aborted at /usr/local/lib/perl/5.18.2/AnyEvent/Impl/EV.pm line 28.
Compilation failed in require at test.pl line 6.
BEGIN failed--compilation aborted at test.pl line 6.
然而,我使用cpanm安装了AnyEvent软件包,并且AnyEvent / Impl / EV.pm文件存在于@INC路径之一中:
$ls /usr/local/lib/perl/5.18.2/AnyEvent/Impl/
Cocoa.pm Event.pm FLTK.pm IOAsync.pm Perl.pm Qt.pm UV.pm
EventLib.pm EV.pm Glib.pm Irssi.pm POE.pm Tk.pm
题
我该如何解决 ?
额外的评论
错误信息显示它正在寻找EV.pm,但我原本期望AnyEvent / Impl / EV.pm.
怎么用AnyEvent :: Impl :: EV;我写的转入perl是在运行时寻找EV.pm吗?
最佳答案 只是尝试使用cpan install AnyEvent重现这一点,并且可以确认我得到了同样的错误.
‘EV.pm’的第28行是使用EV 4.00;.你使用EV;是一个红色的鲱鱼 – 这不是错误的来源.这个模块明确地包含一个“使用”行(坦白地说这有点奇怪,它本身就是’使用’本身?)
除非更改@INC路径,否则我认为这不会起作用 – 我只能假设在没有解构源代码的情况下在其他地方处理此模块的加载.
引用手册页 – 此模块会根据需要自动加载.所以你可能不需要首先使用它.
编辑:刚刚比较了perl版本. Perl 5.8.5显示了相同的行为.我的5.20.1安装没有.
我不确定升级perl是否是正确的步骤,但它可能值得尝试?我会试着找出为什么5.20.1有效.它必须与处理@INC有关.
编辑:
“处理@INC过滤器的返回值(由@INC中的子程序返回的子程序)已经以各种方式修复.以前绑定的变量处理不当,将$_设置为引用或类型地球可能会导致崩溃.”
http://perldoc.perl.org/perl5200delta.html
我想这可能是问题所在.
你肯定并不孤单:
http://www.cpantesters.org/cpan/report/d5939816-a510-11e0-bd04-22322d9f2468
从:
http://cpansearch.perl.org/src/MLEHMANN/AnyEvent-7.08/Changes
5.29 Sun Dec 5 10:49:21 CET 2010
– 将EV后端转换为EV 4.00 API(因此也可以更好地升级EV).