Hallo,
ich habe eine Frage:
Ich muss mir ein Programm schreiben, das Messwerte auswertet. Diese Messwerte liegen in gepackter (.gz) Form vor. Ich habe herausbekommmen, dass ich diese Dateien mit gzip -cdfq entpacken kann.
Wie baue ich das jetzt aber in das Programm ein, damit die Dateien eingelesen werden? Vielleicht kann mir da jemand eine Lösung zukommen lassen?
Vielen Dank schonmal.
MfG
Tim
Hi,
guckst du auf
http://serarch.cpan.org
und gibst
gzip
ein und siehst dass du vermutlich PerlIO::gzip oder Tie::Gzip brauchst…
HTH,
Moritz
Oder über System-Befehl:
system („gzip -cdfq $datei“);
Prinzipieller Nachteil der System-Befehle: sie setzen ein bestimmtes Betriebssystem voraus. Damit der Systembefehl auf einem Windows-Server Sinn macht, müsste man dort erstmal gzip.exe installieren, falls nicht vorhanden. Was wiederum für die Module spräche (siehe andere Antwort).
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hallo,
system („gzip -cdfq $datei“);
Prinzipieller Nachteil der System-Befehle: sie setzen ein
bestimmtes Betriebssystem voraus. Damit der Systembefehl auf
einem Windows-Server Sinn macht, müsste man dort erstmal
gzip.exe installieren, falls nicht vorhanden. Was wiederum für
die Module spräche (siehe andere Antwort).
Es gibt noch mehr Gründe auf die Module zurückzugreifen:
- Performance: beim system()-aufruf wird mindestens ein neuer Prozess gestartet, was meist nicht _so_ wahnsinnig schnell ist.
- Sicherheit. Mit der system()-Variante musst du auf die Variable $file aufpassen. Wenn da z.B. (unter linux) „bla;rm -rf *“ drin steht bist du ein ganzes Verzeichnis los. Hört sich zwar etwas abwegig an, aber wie man an SQL-Injections sehen kann sind das ernst zu nehmende Probleme…
Grüße,
Moritz
Sicherheit / Dateinamen
- Sicherheit. Mit der system()-Variante musst du auf die
Variable $file aufpassen. Wenn da z.B. (unter linux) „bla;rm
-rf *“ drin steht bist du ein ganzes Verzeichnis los.
Ja, im Dateisystem sollte man sowieso nicht mit benutzerdefinierten Namen arbeiten, bzw. sie von Sonderzeichen und Whitespace „befreien“, so dass von deinem beispielhaft gefährlichen Dateinamen übrig bliebe: „bla_rm__rf__“ bzw. noch besser „bla_rm_rf.zip“ oder so.
$dateiname=~tr/\W/_/g; # wäre eine einfache Möglichkeit
Das nur nebenbei. Ich stimme dir wie gesagt zu, dass man, wenn möglich, vorhandene Module benutzen sollte!