Here was my old demo/proposal, such as it was.
--tom
$buff = "\0" x rusage->sizeof();
syscall(&SYS_getrusage, &RUSAGE_SELF, $buff) && die "getrusage: $!";
$ru = rusage->new_from_buffer($buff);
# or
$ru = rusage->new();
$ru->unpack($buff);
# or
@fields = rusage->unpack($buff);
# or
@fields = unpack(rusage->typedef, $buff);
# or
$ru = rusage->read(*FH);
# or
read(FH, $buff, $rusage->sizeof);
$ru = rusage->new_from_buffer($buff);
# or
read(FH, $buff, $rusage->sizeof);
@fields = unpack(rusage->typedef, $buff);
Class methods:
$obj = CSTRUCT->new(); # construct empty
$obj = CSTRUCT->unpack($buff); # construct from packed buffer
$obj = CSTRUCT->new( # construct from pairs
FIELD1 => "value",
FIELD2 => "value",
);
$obj = CSTRUCT->read(*FH); # construct from next bytes on stream
CSTRUCT->seek(*FH,10); # goto record 10 on stream of CSTRUCTs
$recsize = CSTRUCT->sizeof(); # bytes in packed record
$pack_mask = CSTRUCT->typedef(); # format for pack/unpack
Object methods:
$x = $obj->field; # get
$obj->field($value); # set
$obj->unpack($buff);
print $obj->pack;
$obj->write(*FH); # write packed $obj to stream
$obj->read(*FH); # read packed object from stream
$obj->seek(*FH,10); # goto record 10 on stream of (ref $obj)
print $obj->as_string;
print $obj->as_hash;
Example using wtmp log file:
1) Show record of user id #178
use utmp; # would have been #include <utmp.h>
open(WTMP, "/usr/adm/wtmp");
utmp->seek(*WTMP, 178);
$him = utmp->read(*WTMP);
printf "uid %d logged on from %s on %s.\n",
$him->ut_uid, $him->ut_host, scalar local $him->ut_date;
2) Paul's updating records in place
use employee;
open(FH, "+< /tmp/empdata");
$obj = employee->new();
while ($obj = $obj->read(*FH)) {
$obj->salary($obj->salary * 1.06); # *= 1.06
seek(FH, 0, 1);
$obj->write(*FH);
}