2008-10-08 5 views

Antwort

81

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

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

Aber die bessere Lösung ist, zu use lib, das ist ein schöner Weg, um die oben schreiben:

use lib '..'; 
use EPMS; 

In Wenn Sie jedoch von einem anderen Verzeichnis aus arbeiten, wird die Verwendung von FindBin empfohlen:

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

Normalerweise möchten Sie eine Unshift machen, so dass Ihr Verzeichnis bei ist die Vorderseite der Liste. Auf diese Weise muss Perl nicht alle @INC durchsuchen, um es zu finden. :) –

+0

Ja, das stimmt, und so ist auch die BEGIN {push} => 'use lib'-Konvertierung nicht identisch. Aber ich wollte die minimale nutzbare Änderung von der Frage zeigen, damit es funktioniert. Danke für's Bemerken :) – ephemient

+0

Es gibt auch PERL5LIB und den -I Schalter, wie Brian erwähnt. – Axeman

2

Sie müssen die push verarbeitet haben, bevor die use ist - und use wird früh verarbeitet. Also, du brauchst eine BEGIN { push @INC, ".."; }, um eine Chance zu haben, glaube ich.

+1

Normalerweise möchten Sie eine Unshift tun, so dass Sie Verzeichnis an der Spitze der Liste sind. Auf diese Weise muss Perl nicht alle @INC durchsuchen, um es zu finden. :) –

+0

Ja, das auch ... Normalerweise verwende ich keine relativen Namen, weil ich normalerweise keine Skripte von einem festen Verzeichnis aus führe, also ... –

6

'Use lib' ist die Antwort, wie @ephemient zuvor erwähnt. Eine andere Möglichkeit besteht darin, require/import anstelle von use zu verwenden. Das bedeutet, dass das Modul nicht zur Kompilierzeit, sondern zur Laufzeit geladen wird.

Damit können Sie @INC ändern, wie Sie es dort versucht haben, oder Sie könnten einen Pfad zur Datei anstelle des Modulnamens übergeben. Aus ‚perldoc -f require‘:

Wenn EXPR ein Bareword ist, die erfordern nimmt eine „.pm“ Erweiterung und ersetzt ‚::‘ mit ‚/‘ im Dateinamen für Sie, um es einfach zu laden Standardmodule. Diese Form des Ladens von Modulen birgt kein Risiko Ihren Namespace zu ändern.

19

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

  • Satz PERL5LIB als

  • verwenden die -I-Schalter in der Befehlszeile, dokumentiert auch in perlrun in perlrun dokumentiert. Sie können dies auch automatisch mit PERL5OPT anwenden, aber verwenden Sie einfach PERL5LIB, wenn Sie das tun.

  • use lib in Ihrem Programm, obwohl dies fragil ist, da eine andere Person auf einem anderen Computer es in einem anderen Verzeichnis haben könnte.

  • Manuell ändern @INC, stellen Sie sicher, dass Sie das zur Kompilierzeit tun, wenn Sie ein Modul mit Verwendung ziehen möchten. Das ist aber zu viel Arbeit.

11

Persönlich bevorzuge ich meine Module halten (jene, die ich 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:

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

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

push @array => $pushee; 

Aber das ist nur eine Frage der Präferenz.

+2

Diese drückende Syntax sieht unübersichtlich aus. Es deutet definitiv in die falsche Richtung. Aus einer mechanischen Perspektive. Ist es das gleiche wie ein Komma? Das Komma ist viel mehrdeutig bezüglich der Richtung und daher besser ... –

+0

@StevenLu Aus ['perldoc perlop'] (http://perldoc.perl.org/perlop.html # Comma-Operator): * "Der Operator' => 'ist ein Synonym für das Komma, außer dass ein Wort auf der linken Seite als String interpretiert wird, wenn es mit einem Buchstaben oder Unterstrich beginnt und nur aus Buchstaben besteht , Ziffern und Unterstriche. [...] Ansonsten verhält sich der Operator '=>' genau wie der Kommaoperator oder das Listenargumenttrennzeichen, je nach Kontext. "*' => 'wird auch als" fettes Komma "bezeichnet. – ThisSuitIsBlackNot

+0

Schade, das gleiche gilt nicht für '<='. –

1

Wie von "perldoc -f Verwendung" berichtet:

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

, dass eine andere Art und Weise Einlochen, "Verwendung" entspricht:

  • bei der Kompilierung ausgeführt wird,
  • den Paketnamen Namen in eine Datei konvertieren,
  • require -ing, dass die Dateinamen und
  • import -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 tun, eigentlich ein beliebiges Symbol zu exportieren oder eine andere Initialisierung, wenn Sie rufen import, Sie können diese Zeile verlassen:

BEGIN { 
    require '../EPMS.pm'; 
}