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.
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.
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.
Aufruf von system
ist normalerweise ein Fehler. Zum Beispiel, anstatt
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.
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:)
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.