in reply to implications of mmapping the whole enchilada

Have you considered using Tie::File instead? You can treat your file as an array, and Tie::File will read the appropriate lines for you behind the scenes.

I have never tried using Tie::File with fixed-length records, so I don't know if recsep => \$record_length would Do The Right Thing. But since you can use Tie::File on an already-opened filehandle, you can work around that if necessary. Open the file like you normally would, and set local $/ = \1234; to change the handle from line-oriented to record-oriented.