4 Stimmen

Warum lässt sich ein Modul selbst kompilieren, aber nicht, wenn es von einer anderen Stelle aus verwendet wird?

Ich habe ein Perl-Modul, das von sich aus gut zu kompilieren scheint, aber bei anderen Programmen zu einem Kompilierungsfehler führt, wenn es eingebunden ist:

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.

Die ersten paar Zeilen von rebat-report-status sind

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

9voto

mob Punkte 113680

bearbeiten (für die Nachwelt): Ein weiterer Grund für dieses Problem, und vielleicht der häufigste, ist, dass eine zirkuläre Abhängigkeit zwischen den Modulen besteht, die Sie verwenden.


Blick in Rebat/Store.pm nach Hinweisen. Ihr Protokoll sagt, dass Sie versuchen neu laden wurde abgebrochen. Vielleicht Rebat importiert bereits Rebat::Store y Rebat::Store hat eine Paketumfangsprüfung gegen doppeltes Laden.

Dieser Code veranschaulicht die Art von Situation, die ich meine:

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

Der Code wird kompiliert (und 42 gedruckt), wenn Sie einfach die use M1::M2 Zeile in m1.pl . In Ihrem Fall müssen Sie möglicherweise nicht explizit use Rebat::Store in Ihrem Programm.

4voto

Eugene Yarmash Punkte 130008

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X