hi,
$binary_rec = pack("Z10Z10", $name, $vname); # Zwei Felder, je 9 byte
($name, $vname) = unpack("Z10Z10", binary_rec); # binary_rec hat 10 byte
Ne, sind 20 byte, sorry, Druckfehler ;-)
Schablone "Z" füllt binäre Nullen auf, wobei das letzte byte auch für eine NULL reserviert ist, wichtig. Mit "Z10" ist die verfügbare Feldlänge also 9 byte. Im obigen Beispiel wird ein Record mit der read()-Funktion gelesen wie folgt:
~~~perl
binmode HANDLE; # important!
while( read(HANDLE, $bin, 20)){
($name, $vname) = unpack("Z10Z10", $bin);
}
Die "Platzverschwendung" erfolgt nur in der Datei, nicht im RAM, da liegen exact die Werte ohne angehängte Nullen. Für UTF-8-codierte Zeichen bitte entsprechend Platz reservieren.
Wenn Du es ganz ganz sicher haben willst, das Lesen und Schreiben, lege eine Checksumme am Anfang oder Ende der Datei an. Wenn es nur die Länge ist, genügen 4 byte als checksum (Schablone "N"). Md5-hex-checksummen brauchen 32 byte (256 bit) hier kann außer der Länge noch diese oder jene Angabe in die checksumme gewurstet werden, je nach Bedarf ;-)
Hotti