Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine

How can I manipulate fixed-record-length files?

by faq_monk (Initiate)
on Oct 08, 1999 at 00:23 UTC ( [id://648] : perlfaq nodetype . print w/replies, xml ) Need Help??

Current Perl documentation can be found at

Here is our local, out-dated (pre-5.6) version:

The most efficient way is using pack() and unpack(). This is faster than using substr() when take many, many strings. It is slower for just a few.

Here is a sample chunk of code to break up and put back together again some fixed-format input lines, in this case from the output of a normal, Berkeley-style ps:

    # sample input line:
    #   15158 p5  T      0:00 perl /home/tchrist/scripts/now-what
    $PS_T = 'A6 A4 A7 A5 A*';
    open(PS, "ps|");
    print scalar <PS>; 
    while (<PS>) {
        ($pid, $tt, $stat, $time, $command) = unpack($PS_T, $_);
        for $var (qw!pid tt stat time command!) {
            print "$var: <$$var>\n";
        print 'line=', pack($PS_T, $pid, $tt, $stat, $time, $command),

We've used $$var in a way that forbidden by use strict 'refs'. That is, we've promoted a string to a scalar variable reference using symbolic references. This is ok in small programs, but doesn't scale well. It also only works on global variables, not lexicals.