Frage

Ich habe ein Modul in dem übergeordneten Verzeichnis von meinem Skript und ich möchte ‚Verwendung‘ es.

Wenn ich das tue

use '../Foo.pm';

ich Syntaxfehler.

Ich habe versucht zu tun:

push @INC, '..';
use EPMS;

und .. anscheinend nicht zeigen in @INC up

Ich werde verrückt! Was ist hier falsch?

War es hilfreich?

Lösung

use erfolgt zum Zeitpunkt der Kompilierung, so dass dies funktionieren würde:

BEGIN {push @INC, '..'}
use EPMS;

Aber die bessere Lösung zu use lib ist, das ist ein schöner Art und Weise des Schreibens der oben:

use lib '..';
use EPMS;

Wenn Sie aus einem anderen Verzeichnis ausgeführt werden, obwohl die Verwendung von FindBin wird empfohlen:

use FindBin;                     # locate this script
use lib "$FindBin::RealBin/..";  # use the parent directory
use EPMS;

Andere Tipps

Es gibt mehrere Möglichkeiten, wie Sie @INC ändern.

  • gesetzt PERL5LIB, wie dokumentiert in perlrun

  • den -I-Schalter in der Befehlszeile verwenden, dokumentierte auch in perlrun . Sie können dies auch mit PERL5OPT gelten automatisch, sondern nur PERL5LIB verwenden, wenn Sie das tun werden.

  • use lib in Ihrem Programm, auch wenn dies auf einer anderen Maschine, da eine andere Person zerbrechlich ist es in einem anderen Verzeichnis haben könnten.

  • manuell @INC ändern, dafür, dass Sie tun, dass zum Zeitpunkt der Kompilierung, wenn Sie in einem Modul mit der Nutzung ziehen mögen. Das ist zu viel Arbeit aber.

Persönlich bevorzuge ich meine Module halten (jene, die mich für mich selbst zu schreiben oder für Systeme kann ich steuern) in einem bestimmten Verzeichnis, und auch sie in einem Unterverzeichnis zu platzieren. Wie in:

/www/modules/MyMods/Foo.pm
/www/modules/MyMods/Bar.pm

Und dann, wo ich sie verwenden:

use lib qw(/www/modules);
use MyMods::Foo;
use MyMods::Bar;

Als Neben .. wenn es um drängen kommt, ziehe ich das Fett-Pfeil Komma:

push @array => $pushee;

Aber das ist nur eine Frage der Präferenz.

'use lib' ist die Antwort, wie @ephemient bereits erwähnt. Eine andere Option ist, statt Verwendung erfordern / Import zu verwenden. Es bedeutet, dass das Modul nicht bei der Kompilierung geladen werden, sondern in der Laufzeit.

Das erlaubt Ihnen @INC zu ändern, wie Sie es versucht, oder Sie können verlangen, übergeben Sie einen Pfad zur Datei anstelle des Modulnamen. Aus 'perldoc -f require':

  

Wenn EXPR ist ein Bareword, die erfordern nimmt eine „.pm“ Erweiterung und   ersetzt „::“ mit „/“ im Dateinamen für Sie, es einfach zu machen,   laden Standardmodule. Diese Form des Ladens von Modulen nicht Gefahr   Ändern Ihren Namensraum.

Sie haben die push verarbeitet haben, bevor der use ist - und use früh verarbeitet. Also, werden Sie eine BEGIN { push @INC, ".."; } brauchen eine Chance zu haben, glaube ich.

Wie von "perldoc -f Verwendung":

  

Es ist genau entspricht
  BEGIN { require Module; import Module LIST; }
  außer dass Module muss ein Bareword sein.

Einlochen, dass eine andere Art und Weise, "Verwendung" ist gleichbedeutend mit:

  • bei der Kompilierung ausgeführt wird,
  • die Paketnamen zu einem Dateinamen konvertieren,
  • require-ing, dass die Dateinamen und
  • import-ing das Paket.

Also, statt Verwendung aufrufen, können Sie rufen Sie benötigen und Import in einem BEGIN-Block:

BEGIN {
  require '../EPMS.pm';
  EPMS->import();
}

Und natürlich, wenn Ihr Modul nicht wirklich ein beliebiges Symbol tun oder andere Initialisierung exportieren, wenn Sie Import aufrufen, können Sie diese Zeile weglassen:

BEGIN {
  require '../EPMS.pm';
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top