2010-08-04 3 views
76

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

Bitte sagen Sie mir auch, warum wir 1 aus der Datei zurückgeben. Wenn return 2 oder irgendetwas anderes, erzeugt es keinen Fehler, also warum geben wir 1 von Perl-Modul zurück?

+10

'1' spielt keine Rolle. Es kann '2' sein, es kann' 'foo'' sein, es kann' ["a", "list"] 'sein. Wichtig ist, dass es nicht "0" ist, oder irgendetwas anderes, das als falsch bewertet wird, oder "verwenden" würde fehlschlagen. – Amadan

+0

.pl ist eigentlich eine Perl-Bibliothek - Perl-Skripte, wie C-Programme oder Programme in anderen Sprachen geschrieben, haben keine Endung, außer auf Betriebssystemen, die eine Funktion benötigen, wie Windows. –

Antwort

-2

A .pl ist ein einzelnes Skript.

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

Ein Perl-Modul ist ein in sich geschlossenes Stück Perl Code, der von einem Perl-Programm verwendet werden können, oder durch andere Perl-Module. Es ähnelt konzeptionell einer C-Link-Bibliothek oder einer C++ - Klasse.

+4

"A. Pl ist ein einzelnes Skript." Nicht wahr. Nur bei defekten Betriebssystemen müssen Sie Perl-Programme mit der Erweiterung .pl identifizieren. Und ursprünglich.pl zeigte eine "Perl-Bibliothek" an - externe Unterprogramme, die Sie mit einem "require" - oder "do" -Befehl geladen haben. –

65

Im Kern macht die Dateierweiterung, die Sie verwenden, keinen Unterschied, wie perl interpretiert diese Dateien.

Das Einfügen von Modulen in .pm Dateien, die einer bestimmten Verzeichnisstruktur folgen, die dem Paketnamen folgt, bietet jedoch einen praktischen Vorteil. Also, wenn Sie ein Modul haben Example::Plot::FourD und Sie es in einem Verzeichnis Example/Plot/FourD.pm in einem Pfad in Ihrem setzen, dann use und require werden das richtige tun, wenn den Paketnamen wie in use Example::Plot::FourD gegeben.

Die Datei muss als letzte Anweisung return true erfolgreiche Ausführung eines beliebigen Initialisierungscode, um anzuzeigen, so ist es üblich, mit 1; eine solche Datei zu beenden, wenn Sie sicher sind, dass es auch anders wahr zurückkehren werde. Aber es ist besser, nur die 1; zu setzen, falls Sie weitere Anweisungen hinzufügen.

Wenn EXPR ein Bareword ist, nimmt die require eine Erweiterung ".pm" an und ersetzt "::" durch "/" im Dateinamen, um das Laden von Standardmodulen zu erleichtern. Durch diese Form des Ladens von Modulen besteht keine Gefahr, dass Ihr Namespace geändert wird.

Alle use tut, ist der Dateiname aus dem Paketnamen zur Verfügung gestellt, um herauszufinden, require es in einem BEGIN Block und rufen import auf der Verpackung. Nichts hindert Sie daran, use nicht zu verwenden, sondern diese Schritte manuell durchzuführen.

Zum Beispiel habe ich das Example::Plot::FourD Paket in eine Datei namens t.pl, in ein Skript in der Datei s.pl geladen.

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 in 1 zu Ende haben zu einem wahren Wert nicht, tun wird.