use constant CHUNK => 4*1024; sub pseek { my( $p, $o ) = @_; read( $p, my $discard, $CHUNK ), $o -= $CHUNK while $o > $CHUNK; read( $p, $discard, $o-1 ); return $o; } #### open(FILE, $path) || die "$!\n"; seek(FILE, $offset, 0); while() { # do stuff } close FILE; #### open(FILE, '-|', "$cat $file") || die "$!\n";