Was ist in Perl der Unterschied zwischen einer .pm (Perl-Modul) und einer .pl (Perl-Skript) -Datei?

86

Was ist der Unterschied zwischen .pm(Perl-Modul) und .pl(Perl-Skript) Datei?

Bitte sagen Sie mir auch, warum wir 1aus der Datei zurückkehren. Wenn return 2 oder etwas anderes ausgegeben wird, wird kein Fehler generiert. Warum kehren wir also 1vom Perl-Modul zurück?

user380979
quelle
11
1ist egal. Es kann sein 2, es kann sein "foo", es kann sein ["a", "list"]. Was zählt, ist, dass es nicht 0oder irgendetwas anderes als falsch bewertet wird oder usefehlschlagen würde.
Amadan
.pl ist eigentlich eine Perl-Bibliothek - Perl-Skripte, wie C-Programme oder Programme, die in anderen Sprachen geschrieben sind, haben kein Ende, außer auf Betriebssystemen, die eine Funktion benötigen, wie z. B. Windows.
Erinnern Sie sich an Monica

Antworten:

77

Im Kern macht die von Ihnen verwendete Dateierweiterung keinen Unterschied, wie perldiese Dateien interpretiert werden.

Das Einfügen von Modulen in .pmDateien, die einer bestimmten Verzeichnisstruktur folgen, die dem Paketnamen folgt, bietet jedoch eine Annehmlichkeit. Also, wenn Sie ein Modul haben Example::Plot::FourDund setzen Sie es in einem Verzeichnis Example/Plot/FourD.pmin einem Pfad in Ihrem @INC, dann useund requiredas Richtige tun , wenn Sie den Paketnamen als in gegeben use Example::Plot::FourD.

Die Datei muss als letzte Anweisung true zurückgeben, um die erfolgreiche Ausführung eines Initialisierungscodes anzuzeigen. Daher ist es üblich, eine solche Datei mit zu beenden 1; , es sei denn, Sie sind sicher, dass sie andernfalls true zurückgibt. Aber es ist besser, nur das zu setzen 1;, falls Sie weitere Anweisungen hinzufügen.

Wenn EXPRes sich um ein Barwort handelt, requirenimmt das eine ".pm" -Erweiterung an und ersetzt für Sie "::" durch "/" im Dateinamen, um das Laden von Standardmodulen zu vereinfachen. Diese Form des Ladens von Modulen birgt kein Risiko, Ihren Namespace zu ändern.

Alles, was Sie usetun müssen, ist, den Dateinamen aus dem angegebenen Paketnamen requirein einem BEGINBlock herauszufinden und importdas Paket aufzurufen . Nichts hindert Sie daran use, diese Schritte nicht manuell zu verwenden.

Zum Beispiel habe ich das Example::Plot::FourDPaket unten in eine Datei namens aufgerufen t.plund es in ein Skript in einer Datei geladen s.pl.

C:\Temp> cat t.pl
package Example::Plot::FourD;

use strict; use warnings;

sub new { bless {} => shift }

sub something { print "something\n" }

"Example::Plot::FourD"

C:\Temp> cat s.pl
#!/usr/bin/perl
use strict; use warnings;

BEGIN {
    require 't.pl';
}

my $p = Example::Plot::FourD->new;
$p->something;


C:\Temp> s
something

Dieses Beispiel zeigt, dass Moduldateien nicht enden müssen, sondern dass 1ein wahrer Wert ausreicht.

Sinan Ünür
quelle
-2

Ein .pl ist ein einzelnes Skript.

In .pm ( Perl-Modul ) haben Sie Funktionen, die Sie aus anderen Perl-Skripten verwenden können:

Ein Perl-Modul ist ein in sich geschlossener Perl-Code, der von einem Perl-Programm oder anderen Perl-Modulen verwendet werden kann. Es ähnelt konzeptionell einer C-Link-Bibliothek oder einer C ++ - Klasse.

Igor Oks
quelle
5
"Eine .pl ist ein einzelnes Skript." Nicht wahr. Nur auf defekten Betriebssystemen müssen Sie Perl-Programme mit der Erweiterung .pl identifizieren. Und ursprünglich gab .pl eine "Perl-Bibliothek" an - externe Unterprogramme, die Sie mit einem Befehl "require" oder "do" geladen haben.
Dave Cross