#! perl -slw use strict; use constant { RECORD_1 => 'f512 l512', RECORD_2 => 'f3 l3', RECORD_3 => 'ff ll s2', ## index of field in rec2 that contains count of type 3 records that follow it COUNT => 3, }; open I, '<:raw', $ARGV[0] or die "$ARGV[0] { $!"; my @rec1 = unpack RECORD_1, do{ local $/ = \4096; }; until( eof( I ) ) { my @rec2 = unpack RECORD_2, do{ local $/ = \36; }; for ( 1 .. $rec2[ COUNT ] ) { my @rec3 = unpack RECORD_3, do{ local $/ = \28; }; } } close I;