Sollten Perl-Skripte wirklich keine Erweiterung haben?

12

Ich habe gerade angefangen, O'Reillys Learning Perl, 6. Ausgabe, zu lesen und war überrascht, als ich auf diesen Auszug stieß.

#!/usr/bin/perl
print "Hello, world!\n";

Stellen Sie sich vor, Sie haben das in Ihren Texteditor eingegeben. (Machen Sie sich noch keine Gedanken darüber, was die Teile bedeuten und wie sie funktionieren. Sie werden sie gleich sehen.) Sie können dieses Programm im Allgemeinen unter einem beliebigen Namen speichern. Perl benötigt keine spezielle Art von Dateinamen oder Erweiterung, und es ist besser, überhaupt keine Erweiterung zu verwenden.

Warum ist es besser, keine Verlängerung zu haben? Stellen Sie sich vor, Sie haben ein Programm zur Berechnung der Bowling-Ergebnisse geschrieben und allen Ihren Freunden gesagt, dass es bowling.plx heißt. Eines Tages beschließen Sie, es in C umzuschreiben. Nennen Sie es immer noch mit demselben Namen, was bedeutet, dass es immer noch in Perl geschrieben ist? Oder sagst du allen, dass es einen neuen Namen hat? (Und nennen Sie es bitte nicht bowling.c!) Die Antwort ist, dass es sie nichts angeht, in welcher Sprache es geschrieben ist, wenn sie es nur verwenden. Es hätte also eigentlich einfach Bowling heißen sollen.

Dies ist die einzige Quelle, die ich mit dieser Ansicht gesehen habe. Alles andere, was ich gelesen habe, hat die Erweiterung .pl unterstützt. Ich bin noch kein Perl-Programmierer und wollte wissen, wie die Community dazu steht, bevor ich mich daran gewöhnt habe.

Jared
quelle
Wie die Antworten erklären, ist die Erweiterung nicht wichtig. Für Skripte (einschließlich Perl) ist die Shebang-Zeile wichtig .
1
Nein, Sir, stimme nicht zu. Wie entscheiden sich IDEs und Programmierer ohne Dateierweiterung für die Syntaxhervorhebung?
Großmeister
3
@GrandmasterB durch Betrachten der Shebang-Linie oder durch Lesen von Modelines. Ich würde niemals eine .plErweiterung für Programme verwenden, die ich verteilen möchte (diese Informationen sind Rauschen, kein Signal), aber es ist eine nützliche Erinnerung für lokale Skripte. Auf jeden Fall ist diese Diskussion für> 90% des Perl-Codes irrelevant, da sie entweder in einem Modul ( .pmErweiterung erforderlich) oder in einem Test ( .tErweiterung üblich) enthalten ist.
Amon
1
@GrandmasterB Ich entwickle unter Linux, und sowohl Vim als auch Kate identifizieren eine Datei, die mit der Zeile beginnt, korrekt #!/usr/bin/env perlals Perl-Skript, wenn die Datei keine widersprüchliche Erweiterung hat (z. B. .cpp). Das fileProgramm (das zum Ableiten eines MIME-Typs für eine bestimmte Eingabe verwendet wird) leitet text/x-perlunabhängig von der Erweiterung korrekt ab .
Amon
3
Irgendwo da drin dachte ich , wir festgestellt , dass die .pl - Erweiterung für war p erl l ibraries und gemorpht irgendwie in dem, was die Menschen für Programme verwendet.
Brian D Foy

Antworten:

14

Der Rat in diesem Buch ist absolut gültig - zumindest für UNIX-ähnliche Systeme. Die Ausführung des Skripts wird durch die #!Zeile gesteuert , nicht durch den Erweiterungsteil des Dateinamens. Durch die Verwendung einer speziellen Erweiterung für Perl-Skripte werden Informationen angezeigt, die für niemanden, der das Skript ausführt, wichtig sein sollten.

Windows ist eine andere Sache. Windows unterstützt den #!Mechanismus nicht. Stattdessen hängt die Methode zum Öffnen einer Datei von der Erweiterung ab. Beispielsweise kann die Windows-Shell so konfiguriert sein, dass ein Doppelklick auf eine .plDatei (oder das Ausführen an einer Eingabeaufforderung) sie als Argument an den Perl-Interpreter übergibt. Durch die Installation eines Perl-Systems wird dies wahrscheinlich automatisch für Sie eingerichtet.

Bei Perl-Skripten, die portabel sein sollen, kann das .plvon Windows erforderliche Suffix auf UNIX-ähnliche Systeme "gelangen". Es ist wahrscheinlich am besten, eine systemspezifische Installationsmethode zu haben, die bei der Installation einen geeigneten Namen für das Skript auswählt.

Auf UNIX-ähnlichen Systemen eine .plist Erweiterung meist harmlos, und wenn Sie es nützlich , als Erinnerung an das finden , was Sprache , die von einem bestimmten Skript verwendet wird (vielleicht haben Sie eine Sammlung von .pl, .py, .shund .rbScripts), dann können Sie das tun. Dieser Ansatz weist jedoch Nachteile auf, wie im Buch beschrieben: Wenn Sie ein Skript in einer anderen Sprache erneut implementieren, müssen Sie den Namen ändern und alles aktualisieren, was es aufruft.

(Perl- Module müssen eine .pmErweiterung haben, damit Perl sie finden kann. Beispiel:

use Foo::Bar;

Der Interpreter sucht nach einer Datei Bar.pmin einem Verzeichnis, das Foounter einem der im @INCArray aufgeführten Verzeichnisse benannt ist . Aber .pmDateien sind nicht dazu gedacht , direkt ausgeführt werden.)

Dies ist die einzige Quelle, die ich mit dieser Ansicht gesehen habe. Alles andere, was ich gelesen habe, hat die .plErweiterung unterstützt.

Das finde ich überraschend. Die meisten der Rat , den ich gesehen habe , sagt nicht die verwenden .plErweiterung für ausführbare Skripte.

Keith Thompson
quelle
1

Ist egal

#!/usr/bin/perl

teilt dem System mit, welches Programm zum Ausführen des Codes verwendet werden soll.

wenn du das geändert hast

#!/usr/bin/bash

oder

#!/usr/bin/python

Sie würden einen anderen Interpreter verwenden.

Die Erweiterung ist völlig optional, und der Punkt, an dem der Benutzer die Sprache nicht kennen muss, ist in den meisten Fällen zu 100% korrekt.

Laufen add 2 3und zurückkommen 5 ist alles, was mich interessiert (als Benutzer).

Das einzige Mal, wenn ich Skripten eine Erweiterung hinzufüge, ist, wenn der Endbenutzer (manchmal ich selbst) die Sprache aus irgendeinem Grund kennen muss.

example.sh oder example.pl, um verschiedene Möglichkeiten zur Ausführung derselben Aufgabe aufzuzeigen.

Trotzdem ist es üblicher, keine Erweiterung zu haben, aber es ist alles Geschmack.

coteyr
quelle
1

Der Auszug gibt in der Tat einen vollkommen gültigen Rat.

Ich möchte auch hinzufügen, dass es für ein kleineres System ziemlich trivial ist, hier und da einige Dateien und / oder Zeichenfolgen umzubenennen, falls Sie Ihre Meinung über die Implementierung ändern sollten.

Andererseits impliziert ein moderner Trend bei der Entwicklung größerer Systeme, dass die ausführbare Hauptdatei ohne Erweiterung vorhanden ist, während alle Module, von denen es abhängt, weiterhin die sprachspezifische Erweiterung haben.

Tatsächlich erfordert Python dies von Natur aus, und normalerweise besteht das Haupt-Python-Skript (das ohne Erweiterung im Namen) nur aus wenigen Zeilen, die die gesamte App booten.

Alexander Shcheblikin
quelle
0

Das Buch sagt Ihnen nur, dass die Dateierweiterung unter Unix nichts anderes als eine Konvention ist. In der Realität fallen viele Dateitypen in diese Kategorie. Ruby-Dateien verwenden dieselbe Konvention, sodass sie die Erweiterung .rb nicht benötigen. C-Compiler benötigen nur einen gültigen C-Code, sodass Sie sie .watoozy nennen können, wenn Sie möchten.

Während es keine technische Einschränkung gibt, gibt es die praktische Einschränkung des Prinzips der geringsten Überraschung . Grundsätzlich wäre es sehr überraschend, Ruby-Code in einer .pl-Datei zu sehen, also machen die Leute das im Allgemeinen nicht.

Die einzige Ausnahme von der Regel

In einigen Serveranwendungen befindet sich das Startskript in einer Datei ohne Erweiterung, um das Starten der Anwendung als Dienst zu vereinfachen. Die Datei sieht in diesem Fall wie jeder andere kompilierte Befehl aus. Solange Sie Perl installiert haben, verhält es sich auch so.

Berin Loritsch
quelle
C-Compiler behandeln ihre Eingabedateien je nach Erweiterung normalerweise unterschiedlich. Zum Beispiel gcc behandelt .als C - Quellcode, .cpp, .cc, .Cwie C ++ Quellcode, .oals Objektdatei werden weitergegeben an den Linker, und so weiter. Sie können dies mit einer Befehlszeilenoption überschreiben, aber ich habe sie so selten verwendet, dass ich mich nicht daran erinnere, was es ist. Die .cErweiterung für C-Quelldateien ist wichtig. Die .plErweiterung für ausführbare Perl-Skripte ist nicht (zumindest auf UNIX-ähnlichen Systemen).
Keith Thompson
1
@KeithThompson: Auf einem SUS-kompatiblen Unix-System sind diese Dateierweiterungen sogar Teil der Spezifikation für den c99Befehl: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
Jörg W Mittag
-4

Der Auszug aus dem Buch "O'Reillys Learning Perl, 6. Auflage" ist Müll. Der Vergleich von C mit Perl ist nicht äquivalent. Für den Anfang wird C zu einer Binärdatei kompiliert, die keine Erweiterung hat.

Perl wird nicht kompiliert, daher benötigen einige Texteditoren die Erweiterung, um den Dateityp zu identifizieren.

Abgesehen von bewährten Methoden sollten Sie den vollständigen Skriptdateinamen mit der Erweiterung an keiner Stelle in Ihrem System fest codieren. Sie sollten immer einen Symlink oder einen Alias ​​verwenden, der von Ihrem Betriebssystem abhängt.

Wenn Sie in Zukunft die Originaldatei ändern müssen, müssen Sie nur den Symlink ändern, um auf Ihren neuen Speicherort zu verweisen.

Aaron Goshine
quelle
Die Aussage zu Texteditoren mag gültig sein - aber sowohl Emacs als auch Vim können ein Perl-Skript ohne spezielle Erweiterung erkennen. Ihre Behauptung über "Best Practice" wäre mit etwas Unterstützung überzeugender. Ich installiere ständig Perl-Skripte auf meinen (Linux-) Systemen ohne Erweiterungen, und es hat nie ein Problem verursacht.
Keith Thompson
Ja, natürlich wird Ihr Skript ausgeführt, wenn der Hash bang ( #!) in der Zeile steht. Sie erwähnen, dass Sie unter Linux arbeiten, was großartig ist. Wenn Sie das nächste Mal eine Anwendung mit einem Paketmanager installieren, achten Sie genau darauf, wie sie auch erstellt wird Ein Symlink zu Ihrem bin-Verzeichnis, anstatt nur die Datei direkt in Ihr binVerzeichnis zu schreiben . Jedes Wunder, warum.
Aaron Goshine
Vielleicht hängt das vom Paketmanager ab? Auf meinem Ubuntu 14.04-System sind 325 Perl-Skripte direkt unter installiert /usr/bin, nicht als Symlinks. Sie wurden alle vom Paketmanager des Systems installiert. Der Paketmanager verfügt über eine eigene Datenbank, in der die Speicherorte aller Dateien für jedes Paket erfasst werden. (Für Software, die ich aus dem Quellcode erstelle, verwende ich Symlinks.) Ich bin mir jedoch nicht sicher, was dies damit zu tun hat, ob Perl-Skripte eine .plErweiterung haben sollen.
Keith Thompson
Ich denke, hier ist es vielleicht ganz oben angekommen. Der Punkt, den ich anstrebte, ist.
Aaron Goshine
1
Sollte dieser Kommentar mehr enthalten?
Keith Thompson