dviファイルのノンブルの抽出

ちょっと必要があって,dviファイルのページをdviファイルから引き出すスクリプトを書きました.紛失防止の意味も込めて超いいかげんなものを晒します.
ノンブルは一貫している(つまり,途中でリセットとかされない)のが大前提です.

use strict;
use warnings;

use Fcntl ":seek";


my $buf=0;
my $byte=1;

my $dviver = 2;
my $pre = 247;
my $post = 248;
my $dummy=223;

my $first_page;
my $last_page;

my $dvifile=$ARGV[0];

open my $fh_dvi, "<", $dvifile or die "file open error: $!";
binmode $fh_dvi;

##
##pre
###
seek $fh_dvi, 0, SEEK_SET;
read $fh_dvi, $buf, $byte;
$buf = unpack 'C', $buf;
die "uncorrect dvi file!" if $buf != $pre; 
read $fh_dvi, $buf, $byte;
$buf = unpack 'C', $buf;
die "uncorrect dvi file!" if $buf != $dviver; 

seek $fh_dvi, 12, SEEK_CUR;
read $fh_dvi, $buf, $byte;#k
$buf = unpack 'C', $buf;
read $fh_dvi, $buf, $buf*$byte;##num

##
##first bop  
##
read $fh_dvi, $buf, $byte;#bop
read $fh_dvi, $buf, 4*$byte;#c0[4]
$first_page = unpack 'N', $buf;


##
##post_post
##
###dviの最後の223を読み飛ばす
$buf=$dummy;
seek $fh_dvi, 0, SEEK_END;
my $i=0;
while ($buf == 223) {
    $i--;
    seek $fh_dvi, $i, SEEK_END;
    read $fh_dvi, $buf, $byte;
    $buf = unpack 'C', $buf;
}
die "uncorrect dvi file!" unless 4 <= abs($i)-1 && abs($i)-1<=7 && ($buf==2 || $buf==3);

##post の位置を得る
seek $fh_dvi, -5, SEEK_CUR;
read $fh_dvi, $buf, 4*$byte;
$buf = unpack 'N', $buf;

##
##post
##
seek $fh_dvi, $buf, SEEK_SET;
read $fh_dvi, $buf, $byte;
$buf = unpack 'C', $buf;
die "uncorrect dvi file!" unless $buf==$post;

seek $fh_dvi, 26, SEEK_CUR;
read $fh_dvi, $buf, 2*$byte;##t
$buf = unpack 'n', $buf;
$last_page = $first_page + $buf -1;

$first_page=sprintf "%04d",$first_page;
$last_page=sprintf "%04d",$last_page;

print $first_page,"\n";
print $last_page;


close $fh_dvi;

それにしてもきたないし,不親切.もっと整理しないと.