Почему модуль компилируется сам по себе, но не работает, когда используется из другого места? - PullRequest
4 голосов
/ 04 февраля 2010

У меня есть модуль 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;
...

Ответы [ 2 ]

9 голосов
/ 04 февраля 2010

Редактировать (для потомков): Еще одна причина, по которой это происходит, и, возможно, самая распространенная причина, это круговая зависимость между модулями, которые вы используете.


Найдите в Rebat/Store.pm подсказки. Ваш журнал говорит, что попытка перезагрузить была прервана. Может быть, Rebat уже импортирует Rebat::Store, а Rebat::Store имеет некоторую проверку области пакета на предмет двойной загрузки.

Этот код демонстрирует тип ситуации, которую я имею в виду:

# 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.

Код скомпилируется (и напечатает 42), если вы просто удалите строку use M1::M2 в m1.pl. В вашем случае вам может не потребоваться явно указывать use Rebat::Store в вашей программе.

4 голосов
/ 08 июня 2010

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.
...