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を使用してパッケージをインストールしましたがcpanmAnyEvent/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;はちょっとしたニシンです-それはエラーの原因ではありません. このモジュールには明示的に 'use' 行が含まれています (率直に言って、これは少し奇妙です。それ自体が 'using' になっているようです?)

パスが変更されない限り、これがうまくいくとは思いません。@INCこのモジュールのロードは、ソース コードを分解せずに別の場所で処理されるとしか思えません。

マニュアルページを参照 - this module gets loaded automatically as required. useしたがって、最初は必要ないかもしれません。

編集: perl のバージョンを比較しただけです。Perl5.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 - 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 に答える