Mit Perl-Skripten Daten für UNIX-Anwendungen übernehmen

Um an externe Daten zu gelangen, gibt es in Perl drei Möglichkeiten:

  • Backticks
  • system() und exec()
  • open() und parsen

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

ZDNet.de Redaktion

Recent Posts

Gefahren im Foxit PDF-Reader

Check Point warnt vor offener Schwachstelle, die derzeit von Hackern für Phishing ausgenutzt wird.

2 Stunden ago

Bitdefender entdeckt Sicherheitslücken in Überwachungskameras

Video-Babyphones sind ebenfalls betroffen. Cyberkriminelle nehmen vermehrt IoT-Hardware ins Visier.

2 Stunden ago

Top-Malware in Deutschland: CloudEye zurück an der Spitze

Der Downloader hat hierzulande im April einen Anteil von 18,58 Prozent. Im Bereich Ransomware ist…

2 Stunden ago

Podcast: „Die Zero Trust-Architektur ist gekommen, um zu bleiben“

Unternehmen greifen von überall aus auf die Cloud und Applikationen zu. Dementsprechend reicht das Burg-Prinzip…

17 Stunden ago

Google schließt weitere Zero-Day-Lücke in Chrome

Hacker nutzen eine jetzt gepatchte Schwachstelle im Google-Browser bereits aktiv aus. Die neue Chrome-Version stopft…

19 Stunden ago

Hacker greifen Zero-Day-Lücke in Windows mit Banking-Trojaner QakBot an

Microsoft bietet seit Anfang der Woche einen Patch für die Lücke. Kaspersky-Forscher gehen davon aus,…

20 Stunden ago