Was ist der Unterschied zwischen System, Exec und Backticks in Perl?

7

In Perl, um ein anderes Perl-Skript aus meinem Skript auszuführen oder um irgendwelche Systembefehle wie mv , cp , pkgadd , pkgrm , pkginfo , rpm usw. auszuführen, können wir verwenden das Folgende:

  • system()
  • exec()
  • '' (Backticks)

Sind alle drei gleich, oder sind sie anders? Haben alle drei in jedem Fall das gleiche Ergebnis? Werden sie in verschiedenen Szenarien verwendet, wie zum Beispiel ein Perl-Programm aufzurufen, müssen wir system() verwenden und für andere müssen wir '' (Backticks) verwenden.

Bitte informieren Sie mich, da ich derzeit system() für alle Anrufe verwende.

    
PJ. 04.09.2009, 04:26
quelle

6 Antworten

12

Sie sind alle verschieden und die Ärzte erklären, wie sie anders sind. Backticks erfassen und geben die Ausgabe zurück; system gibt einen Exit-Status zurück und exec kehrt nie zurück, wenn es erfolgreich ist.

    
hobbs 04.09.2009, 04:32
quelle
6

IPC :: System :: Simple ist wahrscheinlich, was Sie wollen.

Es bietet sichere, portable Alternativen zu Backticks, system () und anderen IPC-Befehlen.

Außerdem können Sie die Shell für die meisten dieser Befehle vermeiden, was unter bestimmten Umständen hilfreich sein kann.

    
aaa90210 04.09.2009 08:17
quelle
3

Die beste Option besteht darin, ein Modul entweder in der Standardbibliothek oder von CPAN zu verwenden, das die Aufgabe für Sie erledigt. Es wird portabler und möglicherweise sogar schneller für schnelle Aufgaben (keine Verzweigung zum System).

Wenn Ihnen das jedoch nicht gut genug ist, können Sie eines dieser drei verwenden, und nein, sie sind nicht gleich. Lesen Sie die Seiten perldoc auf system() , exec() und backticks um den Unterschied zu sehen.

    
Chris Lutz 04.09.2009 04:31
quelle
1

Aufruf von system ist normalerweise ein Fehler. Zum Beispiel, anstatt

zu sagen %Vor%

solltest du sagen

%Vor%

Sehen Sie sich CPAN für Module an, die andere Befehle für Sie verarbeiten. Wenn Sie viele Aufrufe von system schreiben, ist es möglicherweise an der Zeit, stattdessen in ein Shell-Skript zu wechseln.

    
Chas. Owens 04.09.2009 05:22
quelle
1

Nun, je mehr Menschen, desto mehr Antworten.

Meine Antwort ist, generell die Ausführung von externen Befehlen zu vermeiden. Wenn Sie können - Module verwenden. Es gibt keinen Punkt, der "cp", "mv" und viele andere Befehle ausführt - es gibt Module, die das tun. Der Vorteil von Modulen besteht darin, dass sie normalerweise plattformübergreifend arbeiten. Während Ihr System ("mv") möglicherweise nicht.

Wenn ich in eine Situation gebracht werde, in der ich keinen anderen Weg habe, aber externen Befehl aufzurufen, verwende ich lieber IPC :: Führen Sie aus. Die Idee ist, dass alle vereinfachten Methoden (Backticks, qx, System, offen mit Pipe) von Natur aus unsicher sind und die Beachtung von Parametern erfordern.

Mit IPC :: Run führe ich Befehle wie ich mit System (@array) aus, Das ist viel sicherer, und ich kann separat an stdin, stdout und stderr binden, indem ich Variablen oder Callbacks verwende, was sehr cool ist, wenn man sich in einer Situation befindet, in der man Daten an externe Daten weitergeben muss Programm aus lang laufenden Code.

Es hat auch eingebaute Zeitüberschreitungen, die mehr als einmal nützlich sind:)

    
user80168 04.09.2009 08:41
quelle
-1

Wenn Sie nicht möchten, dass die Shell beteiligt wird (normalerweise nicht) und wenn das Warten auf den Systembefehl akzeptabel ist, empfehle ich die Verwendung von IPC::Run3 . Es ist einfach, flexibel und erledigt die allgemeine Aufgabe, ein Programm auszuführen, es mit Eingaben zu versorgen und seine Ausgabe- und Fehlerströme richtig zu erfassen.

    
hillu 04.09.2009 08:06
quelle

Tags und Links