Reading Fixed-Length Records
Problem
You want to read a file whose records have a fixed length.
Solution
Use read
and unpack
:
# $RECORDSIZE is the length of a record, in bytes. # $TEMPLATE is the unpack template for the record # FILE is the file to read from # @FIELDS is an array, one element per field until ( eof(FILE) ) { read(FILE, $record, $RECORDSIZE) == $RECORDSIZE or die "short read\n"; @FIELDS = unpack($TEMPLATE, $record); }
Discussion
Because the file in question is not a text file, you can’t use
<FH>
or IO:: modules’
getline
method to read in records. Instead, you
must simply read
a particular number of bytes into
a buffer. This buffer then contains one record’s data, which
you decode using unpack
with the right format.
For binary data, the catch is often determining the right format. If
you’re reading data written by a C program, this can mean
peeking at C include files or manpages describing the structure
layout, and this requires knowledge of C. It also requires that you
become unnaturally chummy with your C compiler, because otherwise
it’s hard to predict field padding and alignment (such as the
x2
in the format used in Section 8.18). If you’re lucky enough to be on a
Berkeley Unix system or a system supporting gcc,
then you may be able to use the c2ph tool
distributed with Perl to cajole your C compiler into helping you with
this.
The tailwtmp program at the end of this chapter uses the format described in utmp (5) under Linux and works on its /var/log/wtmp and /var/run/utmp ...
Get Perl Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.