4

Perl モジュールがあり、それ自体は正常にコンパイルされるように見えますが、他のプログラムが含まれているとコンパイルに失敗します。

me@host:~/code $ perl -c -Imodules modules/Rebat/Store.pm
modules/Rebat/Store.pm syntax OK
me@host:~/code $ perl -c -Imodules bin/rebat-report-status
Attempt to reload Rebat/Store.pm aborted
Compilation failed in require at bin/rebat-report-status line 4.
BEGIN failed--compilation aborted at bin/rebat-report-status line 4.

の最初の数行rebat-report-status

...
3 use Rebat;
4 use Rebat::Store;
5 use strict;
...
4

2 に答える 2

9

編集(後世のために):これが発生するもう1つの理由、そしておそらく最も一般的な理由は、使用しているモジュール間に循環依存関係があることです。


Rebat/Store.pm手がかりを探してください。ログには、リロードの試行が中止されたと書かれています。すでにRebatをインポートRebat::StoreRebat::Storeている可能性があり、2 回読み込まれることに対するパッケージ スコープのチェックが行われている可能性があります。

このコードは、私が意味する状況の種類を示しています。

# m1.pl:
use M1;
use M1::M2;
M1::M2::x();

# M1.pm 
package M1;
use M1::M2;
1;

# M1/M2.pm
package M1::M2;
our $imported = 0;
sub import {
    die "Attempt to reload M1::M2 aborted.\n" if $imported++;
}
sub x { print "42\n" }
1;

$ perl m1.pl
Attempt to reload M1::M2 aborted.
BEGIN failed--compilation aborted at m1.pl line 3.

use M1::M2の行を削除するだけで、コードはコンパイルされます (そして 42 が出力されます) m1.pl。あなたの場合、use Rebat::Storeプログラムで明示的にする必要はないかもしれません。

于 2010-02-04T18:47:17.847 に答える
4

perldoc perldiag :

 Attempt to reload %s aborted.
           (F) You tried to load a file with "use" or "require" that failed to
           compile once already.  Perl will not try to compile this file again
           unless you delete its entry from %INC.  See "require" in perlfunc
           and "%INC" in perlvar.
于 2010-06-08T15:50:26.307 に答える