Warum wird ein Modul selbst kompilieren, aber wenn man von anderswo verwendet scheitern?

StackOverflow https://stackoverflow.com/questions/2202243

  •  18-09-2019
  •  | 
  •  

Frage

Ich habe ein Perl-Modul, das von selbst zu kompilieren fein erscheint, aber verursacht andere Programme Kompilierung fehlschlagen, wenn es enthalten 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 rebat-report-status sind

...
3 use Rebat;
4 use Rebat::Store;
5 use strict;
...
War es hilfreich?

Lösung

Bearbeiten (für die Nachwelt): Ein weiterer Grund für diese auftreten, und vielleicht der häufigste Grund ist, dass es eine zirkuläre Abhängigkeit zwischen den Modulen ist, die Sie mit

.

Schauen Sie in Rebat/Store.pm nach Hinweisen. Ihre Log sagt Versuch, reload abgebrochen wurde. Vielleicht Rebat bereits importiert Rebat::Store und Rebat::Store hat einige Paket-Umfang Prüfung gegen zweimal geladen werden.

Dieser Code zeigt 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 kompiliert (und druckt 42), wenn Sie nur die use M1::M2 Linie in m1.pl entfernen. In Ihrem Fall müssen Sie nicht explizit in Ihrem Programm use Rebat::Store.

Andere Tipps

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.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top