4

语境

这是一个 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.

但是我AnyEvent使用安装了该软件包cpanm,并且该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的。
我写的怎么在运行时use AnyEvent::Impl::EV;变成了perl is looking for EV.pm

4

2 回答 2

1

只是试图重现这个cpan install AnyEvent并可以确认我得到了同样的错误。

“EV.pm”的第 28 行是use EV 4.00;. 您use EV;的做法有点牵强 - 这不是错误的根源。该模块明确包含一个“使用”行(坦率地说,这有点奇怪,它似乎是“使用”本身?)

我认为这永远不会奏效,除非@INC路径被改变——我只能假设这个模块的加载是在其他地方处理的,而不是解构源代码。

参考手册页 - this module gets loaded automatically as required。所以你可能一开始就不需要use它。

编辑:刚刚比较了 perl 版本。Perl5.8.5显示了相同的行为。我的5.20.1安装没有。

我不确定升级 perl 是否一定是正确的步骤,但它可能值得一试吗?我会尝试弄清楚为什么 5.20.1 有效。它必须与处理有关@INC

编辑:

“@INC 过滤器(@INC 中的子例程返回的子例程)的返回值的处理已以各种方式修复。以前绑定的变量处理不当,将 $_ 设置为引用或 typeglob 可能会导致崩溃。”

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 - convert EV backend to EV 4.00 API (so better upgrade EV too).

于 2014-12-17T14:17:45.603 回答
1

错误消息实际上是一个非常正确且指向应该做什么的前向指针:有一个EV需要单独安装的包:

$ sudo cpanm EV
--> Working on EV
Fetching http://www.cpan.org/authors/id/M/ML/MLEHMANN/EV-4.18.tar.gz ... OK
Configuring EV-4.18 ... OK
Building and testing EV-4.18 ... OK
Successfully installed EV-4.18
1 distribution installed

之后,一切正常:

$ cat test.pl 
#!/usr/bin/perl

use strict;
use warnings;

use AnyEvent;
use EV;

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");
  },
);

# now wait till our time has come
EV::run();

$ perl test.pl 
Hello from callback
于 2014-12-17T14:59:36.193 回答