Frage

Wenn mein Perl-Programm verwendet Perl-Module, wie wird es festzustellen, wo die Datei zu finden, um den Modul-Code enthält?

Zum Beispiel, wenn das Programm enthält:

use MyModule1;              # Example 1
use This::Here::MyModule2;  # Example 2

Dabei wird es aussehen?

War es hilfreich?

Lösung

Perl-Interpreter (die Ihr Perl-Programm ausgeführt wird) wird ein spezielles Array @INC genannt verwenden für eine Datei zu suchen, um das Modul enthält.

Jeder Wert in der @INC Array ist ein Verzeichnisname ( aber siehe Anmerkung unten ); Perl wird in diesen Verzeichnissen in einer Schleife suchen, die folgenden Regeln festgelegt werden. (Bitte beachten Sie: wie oben angegeben in # 2 Logik kann auch Unterroutine Referenzen und Objektreferenzen , die geladen werden, die Module als ihren eigenen Code gibt an, anstatt die Durchführung der Suche in dem Verzeichnis enthalten. Diese Funktionalität scheint sehr zu selten genutzt und in diesem Artikel wird davon ausgegangen, dass ganzer @INC enthält nur Verzeichnisse.

Lassen Sie uns gehen über ein spezielles Beispiel, vorausgesetzt, dass Ihr @INC enthält zwei Unterverzeichnisse: ("/usr/lib/perl", "/opt/custom/lib").

Dann sucht Perl würde wie folgt:

==========================================================================
| Module                | Try # | File to try               
==========================================================================
| MyModule1             | Try 1 | /usr/lib/perl/MyModule1.pm
| MyModule1             | Try 2 | /opt/custom/lib/MyModule1.pm
==========================================================================
| This::Here::MyModule2 | Try 1 | /usr/lib/perl/This/Here/MyModule2.pm
| This::Here::MyModule2 | Try 2 | /opt/custom/lib/This/Here/MyModule2.pm
==========================================================================

Bitte erinnere sich, dass Perl-Interpreter versucht wird STOP, um zu suchen, wenn es um die Datei in einem der Orte findet, ohne zu versuchen, um zu sehen, ob die Datei auch in späteren Orten ist. Z.B. wenn /usr/lib/perl/This/Here/MyModule2.pm vorhanden ist, dann wird Perl nicht sucht, noch Sorge um die Existenz, die von /opt/custom/lib/This/Here/MyModule2.pm.

Hinweis: @INC verwendet wird, wenn Perl-Interpreter require-ähnlichen Mechanismus verwendet für Module Perl importieren. Dazu gehören:

  • require Richtlinie selbst
  • use MyModule Anweisung (entspricht + Import erforderlich)
  • use base (entspricht + "push @ISA" zu verlangen)
  • -M Befehlszeilenparameter

Andere Tipps

Während diese nicht direkt die Frage beantworten, sind hier einige einfache Techniken, um den vollständigen Pfad zum Modul Datei, die Sie verwenden möchten, zu bestimmen.

Um die Standard Inhalte der @INC Array, zusammen mit vielen von anderen Informationen, von der Befehlszeile:

perl -V      

Wenn Sie die Position des Carp Modul wissen wollen:

perldoc -l Carp

In einem Skript, das Drucken der Inhalte der % INC Hash ist nützlich das eigentliche Modul zu bestimmen, die Sie verwenden, vor allem, wenn Sie geändert haben @INC aus sein Standardwert:

use Carp;
print $INC{'Carp.pm'};

Dieses einfache Skript kann auch verwendet werden Finden installiert Perl-Module einen regulären Ausdruck passende und alle doppelten Module in verschiedenen Verzeichnissen zu identifizieren.

Nach der perlfunc Dokumentation auf use :

  

Verwendung Modulliste

     

Importiert einige Semantik in das aktuelle Paket aus dem Modul mit dem Namen, in der Regel durch bestimmtes Unterprogramm Aliasing oder Variablennamen in Ihr Paket. Es ist genau äquivalent zu

BEGIN { require Module; Module->import( LIST ); }
     

, außer dass Module muss ein Bareword sein.

So require macht das Heben schwerer Lasten und der require Dokumentation bietet

  

Wenn EXPR ein Bareword ist, nimmt die erfordern eine ".pm" Erweiterung und ersetzt "::" mit "/" im Dateinamen für Sie, um es einfach Standard-Module zu laden. Diese Form der Laden von Modulen keine Gefahr besteht, nicht Ihren Namensraum zu ändern.

     

Mit anderen Worten, wenn Sie versuchen, diese:

   require Foo::Bar;    # a splendid bareword
     

Die Funktion erfordern aussehen wird tatsächlich für die "Foo/Bar.pm" Datei in den in dem @INC Array angegebenen Verzeichnissen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top