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

Umfrage: Angestellte in Deutschland unterschätzen NIS-2-Richtlinie

Fast zwei Drittel halten jedoch eine Umsetzung aller Vorgaben von NIS 2 bis Jahresende für…

4 Stunden ago

Kostenloser Dekryptor für ShrinkLocker

Mit dem Dekryptor von Bitdefender können Opfer von Attacken mit der Shrinklocker-Ransomware Dateien wiederherstellen.

18 Stunden ago

Malwarebytes warnt vor Betrugsmaschen beim Weihnachtseinkauf

In der Vorweihnachtszeit ist vor allem Malvertising auf dem Vormarsch. Cyberkriminelle locken Nutzer über schädliche…

18 Stunden ago

Bedrohungsindex: Deutliche Zunahme von Infostealern im Oktober

Dazu trägt unter der Infostealer Lumma-Stealer bei. Hierzulande dominiert der Infostealer Formbook die Malware-Landschaft.

1 Tag ago

Chrome 131 schließt zwölf Sicherheitslücken

Eine schwerwiegende Anfälligkeit hebelt die Sicherheitsfunktion Seitenisolierung auf. Betroffen sind Chrome für Windows, macOS und…

1 Tag ago

DeepL Voice mit KI für Sprach- übersetzungen

DeepL Voice ermöglicht Live‑Übersetzung von Meetings und Gesprächen in 13 Sprachen.

2 Tagen ago