Um an externe Daten zu gelangen, gibt es in Perl drei Möglichkeiten:
Wir wollen einen Blick auf diese drei Techniken werfen und uns ein umfangreicheres Beispiel mit open() und parsen anschauen.
Backticks
Die einfachste Methode für das Einlesen von Daten ist die Verwendung von Apostrophen, auch Backticks genannt. Unter UNIX weisen die Backticks (`) um einen Befehl die Shell an, diesen auszuführen. Wer schon einmal mit Shell-Skripten gearbeitet hat, wird wissen, wie das funktioniert. Setzen Sie einfach den vollständigen Pfad des auszuführenden Programms (einschließlich aller Argumente) in Apostrophe, und der Perl-Interpreter wird versuchen, diesen Befehl auszuführen. Perl wird alles, was der Befehl an die Standardausgabe STDOUT ausgibt, einer Variablen zuweisen. Um z.B. einen String mit dem aktuellen Datum zu erhalten, könnte Ihr Skript die folgende Zeile enthalten:
$date=`/usr/bin/date`;
Die Variable $date enthält nun einen Null-terminierten String mit dem aktuellen Datum. Die Variable $? (genau wie bei Shell-Skripten) enthält den Rückgabewert des letzten run-Befehls. Dies ist bei Weitem die einfachste Methode, an externe Daten zu gelangen, aber es funktioniert nur gut, wenn die Ausgabe einzeilig ist. Sollte der Output aus mehreren Zeilen bestehen, kann er mit einer Kombination aus split() und einer foreach-Schleife geparst werden, wie Listing A zeigt.
Dies ist schon um einiges weniger effizient als die vorige Methode. Auch die Fehlersuche ist bei der Verwendung von Backticks schwierig, da alle Fehlermeldungen von Systemfehlern (executable not found) bis zu anwendungsspezifischen Fehlern in der Output-Variablen gespeichert werden ($date in unserem Beispiel).
system() und exec()
Ein weiterer Ansatz nutzt die Funktionen system() oder exec(). Diese Funktionsaufrufe funktionieren fast genau so wie die POSIX system(2)- und exec(2)-Aufrufe, die man auf den meisten UNIX-Plattformen findet. Beide Funktionen erwarten den Namen einer ausführbaren Datei als erstes Argument, gefolgt von der Liste der an das externe Programm zu übergebenden Argumente.
Die exec()-Funktion gibt nur dann eine Fehlermeldung zurück, wenn sie das auszuführende Programm nicht findet, ignoriert aber den Output oder Rückgabewert des externen Programms. Die system()-Funktion wartet das Ende des externen Programms ab und gibt dann den Exit-Status des aufgerufenen Programms zurück. Alles, was das aufgerufene Programm an STDOUT gesendet hat, geht verloren. Dies ist eine nützliche Funktion, wenn man nicht daran interessiert ist, was das externe Programm an STDOUT geschickt hat. Will man dagegen diese Daten auswerten, ist unsere nächste Methode genau das Richtige.
open() und parsen
Die leistungsfähigste Methode für das Ausführen eines externen Prozesses ist das Öffnen einer Pipe zum externen Programm mit Perls open()-Funktion. Da open() erlaubt, den Output genau so zu lesen wie eine Datei, bietet dieses Vorgehen die größte Flexibilität.
Page: 1 2
Der Cybersecurity Report von Hornetsecurity stuft 2,3 Prozent der Inhalte gar als bösartig ein. Die…
Die Hintermänner haben es auf Zugangsdaten zu Microsoft Azure abgesehen. Die Kampagne ist bis mindestens…
Cloud-Plattform für elektronische Beschaffungsprozesse mit automatisierter Abwicklung elektronischer Rechnungen.
Mindestens eine Schwachstelle erlaubt eine Remotecodeausführung. Dem Entdecker zahlt Google eine besonders hohe Belohnung von…
Nur rund die Hälfte schaltet während der Feiertage komplett vom Job ab. Die anderen sind…
Security-Experten von Check Point sind einer neuen Angriffsart auf die Spur gekommen, die E-Mail-Schutzmaßnahmen umgehen…