hotti: Daten mit Storable speichern

Beitrag lesen

Moin,

ich verwende das Modul Storable um Daten meines Scripts zu speichern und beim nächsten Aufruf wieder zur Verfügung zu haben.

Falls Du nur Arrays hast, die lassen sich recht einfach in Raw-Dateien serialisieren. Zwei Varianten:

1 Alle Array-Elemente haben ungefähr dieselbe Länge. Nach dem Längsten richtet sich die Schablone für pack(), entweder "A99" oder "Z99", wobei die 99 hier für die Länge eines Records steht (anpassen). Schablone "A" füllt die bytes mit Leerzeichen auf, "Z" mit binären Null-bytes, dabei ist eine NULL für das Stringende reserviert. Das Dateihandle wird in den binmode geschaltet und das Array ohne Zeilenumbrüche in die Datei geschrieben, genauso wird es da auch wieder ausgelesen. flock() ist auf das Handle anzuwenden, kein Thema.

2 Die Array-Elemente haben sehr unterschiedliche Längen. Da wird beim Serialisieren die Länge mit length() ermittelt und als 4-byte-Integer mitgespeichert, das sieht dann so aus:

|_|_|_|_|<----- Listenelement vaiable Länge --->|_|_|_|_|<----- Listenelement vaiable Länge --->|_ usw.

|_|_|_|_| <- diese 4 byte beeinhalten die Länge eines Array-Elements, pack("N", length($e)); erzeugt diese 4 byte.

Das Auslesen (deserialize) geht genau andersherum, 4 byte lesen, die Länge ergibt sich mit unpack("N", $4byte) und so die Anzahl der bytes für das nächste Listenelement.

Wenn Du es ganz sicher machen willst, schreibe an den Anfang oder an das Ende der Datei eine Checksumme, dafür gibt es wiederum mehrere Möglichkeiten.

Weitere Möglichkeiten ergeben sich mit tie(), der Zugriff auf die Datei ist dann ein Zugriff auf ein Array.

Für Hashes einen eigenen Algorithmus zu finden ist auch nicht schwer, es ist nur so, dass darüber kaum was im Internet zu finden ist. Es lohnt jedoch eine Auseinandersetzung mit dem Thema allemal, in meiner Praxis verwende ich so eigene Module für Serialize/Unserialize, die sehr performant arbeiten, dessen Einsatz ich stets gegenüber einer DB-Lösung abwäge und meistens auch bevorzuge.

Hotti