4 Stimmen

Warum sollte ich keine Shell-Tools in Perl-Code verwenden?

Im Allgemeinen wird davon abgeraten, zusätzliche Linux-Tools in einem Perl-Code zu verwenden; Wenn jemand z.B. die letzte Zeile einer Textdatei ausgeben will, kann er das tun:

$last_line = `tail -1 $file` ;

oder anderweitig, öffnen Sie die Datei und lesen Sie sie Zeile für Zeile

 open(INFO,$file);
 while(<INFO>) {
   $last_line = $_ if eof;
   }

Was sind die Fallstricke bei der Verwendung der vorherigen und warum sollte ich die Verwendung von Shell-Tools in meinem Code vermeiden?

Vielen Dank,

24voto

Chas. Owens Punkte 62716
  • Effizienz - es muss kein neuer Prozess gestartet werden
  • Portabilität - Sie müssen sich keine Sorgen machen, dass eine ausführbare Datei nicht existiert, andere Schalter akzeptiert oder eine andere Ausgabe hat
  • Benutzerfreundlichkeit - Sie müssen die Ausgabe nicht parsen, die Ergebnisse liegen bereits in einer brauchbaren Form vor
  • Fehlerbehandlung - Sie haben eine feinere Kontrolle über Fehler und deren Behandlung in Perl.

15voto

Ry4an Brase Punkte 77642

Es ist besser, die ganze Aktion in Perl zu halten, weil es schneller ist und weil es sicherer ist. Es ist schneller, weil Sie keinen neuen Prozess starten, und es ist sicherer, weil Sie sich keine Sorgen über Shell-Meta-Zeichentricks machen müssen.

In Ihrem ersten Fall zum Beispiel, wenn $file enthalten " afilename ; rm -rf ~ " wären Sie ein sehr unglücklicher Camper.

P.S. Der beste Allrounder für den Schwanz ist die Verwendung von Datei::ReadBackwards

10voto

ennuikiller Punkte 44945

Einer der Hauptgründe (neben der Portabilität) für den Verzicht auf die Ausführung von Shell-Befehlen ist der Overhead, der dadurch entsteht, dass ein weiterer Prozess gestartet wird. Aus diesem Grund ist ein Großteil der gleichen Funktionalität über CPAN in Perl-Modulen verfügbar.

9voto

thedz Punkte 5396

Ein Grund dafür ist, dass Ihr Perl-Code möglicherweise in einer Umgebung läuft, in der es kein Shell-Tool namens 'tail' gibt.

Es ist eine persönliche Entscheidung, die vom jeweiligen Projekt abhängt:

  • Wird es immer in Shell-Umgebungen mit Tail verwendet?
  • Ist es Ihnen wichtig, nur reinen Perl-Code zu verwenden?

5voto

jrockway Punkte 40754

Verwendung von tail ? Gut. Aber das ist wirklich ein Sonderfall, weil es so einfach zu benutzen und so trivial ist.

Das Problem ist im Allgemeinen nicht wirklich die Effizienz oder die Übertragbarkeit, das ist weitgehend irrelevant; das Problem ist die Benutzerfreundlichkeit. Um ein externes Dienstprogramm auszuführen, müssen Sie herausfinden, welche Argumente es akzeptiert, Code schreiben, um die Datenstrukturen Ihres Programms in dieses Format umzuwandeln, sie richtig zu zitieren, die Befehlszeile zu erstellen und die Anwendung auszuführen. Dann müssen Sie es mit Daten füttern und Daten von ihm lesen (was eine komplexe Aufgabe wie eine Ereignisschleife, die Sorge um Deadlocking usw. bedeutet), und schließlich den Rückgabewert interpretieren. (UNIX-Prozesse betrachten "0" als wahr und alles andere als falsch, aber Perl nimmt das Gegenteil an. foo() and die ist schwer zu lesen.) Das ist eine Menge Arbeit, und deshalb vermeiden es die Leute. Es ist viel einfacher, eine Instanz einer Klasse zu erstellen und Methoden aufzurufen, um die benötigten Daten zu erhalten.

(Sie können auf diese Weise Prozesse abstrahieren; gpg ,

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X