Perl-Pakete und Module

In Perl hat jedes Paket eine separate Symboltabelle. Die definierende Syntax lautet:

package mypack;

Diese Anweisung definiert ein Paket namensmypack, und die Namen aller Variablen und Unterprogramme, die nach diesem Punkt definiert werden, werden in der Symboltabelle gespeichert, die mit diesem Paket verknüpft ist, bis eine weiterepackage-Anweisung angetroffen wird.

Jede Symboltabelle hat ihren eigenen Satz von Variablen- und Unterprogrammnamen. Die Namenssätze sind voneinander unabhängig, sodass derselbe Variablenname in verschiedenen Paketen verwendet werden kann und unterschiedliche Variablen repräsentiert.

Um von einem Paket aus auf eine Variable in einem anderen Paket zuzugreifen, können Sie sie in der Form "Paketname + doppelter Doppelpunkt (::) + Variablenname" angeben.

Die Standard-Symboltabelle, die die Namen von Variablen und Unterprogrammen speichert, ist diejenige, die mit dem benanntenmain-Paket verknüpft ist. Wenn im Programm andere Pakete definiert sind und Sie zur Standard-Symboltabelle zurückwechseln möchten, können Sie das main-Paket erneut angeben:
package main;

Auf diese Weise verhält sich das folgende Programm, als wäre nie ein Paket definiert worden, und Variablen- und Unterprogrammnamen werden wie üblich gespeichert.

Im folgenden Beispiel enthält die Datei die Pakete main und Foo. Die spezielle Variable__PACKAGE__wird verwendet, um den Paketnamen auszugeben:

Beispiel

#!/usr/bin/perl # main-Paket $i = 1; print "Paketname:" , __PACKAGE__ , " $i\n"; package Foo; # Foo-Paket $i = 10; print "Paketname:" , __PACKAGE__ , " $i\n"; package main; # Das main-Paket erneut angeben $i = 100; print "Paketname:" , __PACKAGE__ , " $i\n"; print "Paketname:" , __PACKAGE__ , " $Foo::i\n"; 1;

Das Ausführen des obigen Programms erzeugt das folgende Ergebnis:

包名 : main 1
包名 : Foo 10
包名 : main 100
包名: main 10

BEGIN- und END-Blöcke

Die Sprache Perl bietet zwei Schlüsselwörter: BEGIN und END. Beide können jeweils eine Reihe von Skripten enthalten, die ausgeführt werden, bevor oder nachdem der Programmhauptteil ausgeführt wird.

Die Syntax lautet wie folgt:

BEGIN { ... }
END { ... }
BEGIN { ... }
END { ... }
  • JederBEGIN-Block wird ausgeführt, nachdem das Perl-Skript geladen und kompiliert wurde, aber bevor andere Anweisungen ausgeführt werden.

  • JederEND-Anweisungsblock wird ausgeführt, bevor der Interpreter beendet wird.

  • BEGIN- undEND-Anweisungsblöcke sind besonders nützlich beim Erstellen von Perl-Modulen.

Wenn du es noch nicht ganz verstehst, können wir uns ein Beispiel ansehen:

Beispiel

#!/usr/bin/perl package Foo; print "Begin- und Block-Beispiel\n"; BEGIN { print "Dies ist der BEGIN-Anweisungsblock\n" } END { print "Dies ist der END-Anweisungsblock\n" } 1;

Das Ausführen des obigen Programms erzeugt das folgende Ergebnis:

这是 BEGIN 语句块
Begin 和 Block 实例
这是 END 语句块

Was ist ein Perl-Modul?

In Perl 5 werden Perl-Pakete verwendet, um Module zu erstellen.

Ein Perl-Modul ist ein wiederverwendbares Paket. Der Modulname ist derselbe wie der Paketname, und die Dateiendung für Definitionen ist.pm。

Im Folgenden definieren wir ein Modul Foo.pm, und der Code sieht wie folgt aus:

Beispiel

#!/usr/bin/perl package Foo; sub bar { print "Hallo $_[0]\n" } sub blat { print "World $_[0]\n" } 1;

In Bezug auf Module in Perl sind folgende Punkte zu beachten:

  • Die Funktionenrequireunduseladen ein Modul.

  • @INCist ein spezielles in Perl eingebautes Array, das Verzeichnispfade zu den Speicherorten von Bibliotheksroutinen enthält.

  • requireunduserufen die Funktionevalauf, um den Code auszuführen.

  • Am Ende1;muss ausgeführt werden und TRUE zurückgeben. Dies ist notwendig, andernfalls wird ein Fehler zurückgegeben.


Require- und Use-Funktionen

Module können über dierequireFunktion aufgerufen werden, wie unten gezeigt:

Beispiel

#!/usr/bin/perl require Foo; Foo::bar( "a" ); Foo::blat( "b" );

Es kann auch über die use-Funktion referenziert werden:

Beispiel

#!/usr/bin/perl use Foo; bar( "a" ); blat( "b" );

Wir stellen fest, dass require-Referenzen den Paketnamen verwenden müssen, um die Funktion anzugeben, während use dies nicht muss. Die Hauptunterschiede zwischen den beiden sind:

  • 1. require wird verwendet, um Module oder Perl-Programme zu laden (das Suffix .pm kann weggelassen werden, aber das Suffix .pl muss vorhanden sein)
  • 2. Die Perl-Anweisung use wird zur Kompilierzeit eingebunden, während require zur Laufzeit eingebunden wird.
  • 3. Wenn Perl use ein Modul importiert, importiert es auch die Untermodule des Moduls. require kann sie jedoch nicht importieren; sie müssen erneut deklariert werden.
  • 4. USE sucht im aktuellen Standard-@INC. Sobald das Modul nicht in @INC ist, kann es nicht mit USE importiert werden, aber require kann einen Pfad angeben.
  • 5. Wenn USE auf ein Modul verweist, wird bei einem Modulnamen, der :: (doppelter Doppelpunkt) enthält, der doppelte Doppelpunkt als Pfadtrennzeichen verwendet, äquivalent zu / unter Unix oder \ unter Windows. Zum Beispiel:
    use MyDirectory::MyModule

Durch Hinzufügen der folgenden Anweisung können Sie mithilfe des Moduls die Symbole in der Liste exportieren:

require Exporter;
@ISA = qw(Exporter);

Das Array @EXPORT enthält die Namen der standardmäßig exportierten Variablen und Funktionen:

package Module;

require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(bar blat);  # 默认导出的符号

sub bar { print "Hello $_[0]\n" }
sub blat { print "World $_[0]\n" }
sub splat { print "Not $_[0]\n" }  # Not exported!

1;

Erstellen eines Perl-Moduls

Mit dem Tool h2xs, das mit der Perl-Distribution geliefert wird, können Sie einfach ein Perl-Modul erstellen.

Sie können h2xs im Kommandozeilenmodus eingeben, um seine Parameterliste anzuzeigen.

Syntaxformat von h2xs:

$ h2xs -AX -n  ModuleName

Parameter description:

  • -AIgnorieren Sie den Autoload-Mechanismus

  • -XIgnorieren Sie XS-Elemente

  • -nGeben Sie den Namen des Erweiterungsmoduls an

Wenn sich Ihr Modul beispielsweise in derPerson.pm-Datei befindet, verwenden Sie den folgenden Befehl:

$ h2xs -AX -n Person

Beim Ausführen des obigen Programms wird Folgendes ausgegeben:

Writing Person/lib/Person.pm
Writing Person/Makefile.PL
Writing Person/README
Writing Person/t/Person.t
Writing Person/Changes
Writing Person/MANIFEST

Im Person-Verzeichnis können Sie die neu hinzugefügten Verzeichnisse und Dateibeschreibungen sehen:

  • README: Diese Datei enthält einige Installationsinformationen, Modulabhängigkeiten, Urheberrechtsinformationen usw.

  • Changes: Diese Datei dient als Änderungsprotokolldatei für Ihr Projekt.

  • Makefile.PL: Dies ist der standardmäßige Perl-Makefile-Konstruktor. Er wird verwendet, um die Datei Makefile.PL zu erstellen, um das Modul zu kompilieren.

  • MANIFEST: Diese Datei wird verwendet, um automatisch Moduldistributionen des Typs tar.gz zu erstellen. Auf diese Weise können Sie Ihr Modul auf CPAN veröffentlichen oder an andere weitergeben. Sie enthält eine Liste aller Dateien in diesem Projekt.

  • Person.pm: Dies ist die Hauptmoduldatei, die Ihren mod_perl-Handler-Code enthält.

  • Person.t: Einige Testskripte für das Modul. Standardmäßig wird nur geprüft, ob das Modul geladen ist, und Sie können einige neue Testeinheiten hinzufügen.

  • t/: Testdateien

  • lib/: Verzeichnis, in dem der eigentliche Quellcode gespeichert ist

Sie können den Befehl tar (unter Linux) verwenden, um die oben genannten Verzeichnisse in Person.tar.gz zu packen.


Perl-Module installieren

Wir können die DateiPerson.tar.gzdekomprimieren und installieren, und die Ausführungsschritte sind wie folgt:

tar xvfz Person.tar.gz
cd Person
perl Makefile.PL
make
make install

Führen Sie zuerst "perl Makefile.PL" aus, um eine Makefile im aktuellen Verzeichnis zu erzeugen;

Führen Sie dann "make" aus, um zu kompilieren und die erforderlichen Bibliotheksdateien zu erstellen;

Verwenden Sie dann "make test", um zu prüfen, ob das Kompilierungsergebnis korrekt ist; führen Sie schließlich "make install" aus, um die Bibliotheksdateien in das Systemverzeichnis zu installieren. An diesem Punkt ist der gesamte Kompilierungsprozess abgeschlossen.

Weitere Erweiterungen