Avoid
join "", <FH>;
It has to separate the file into records first, build a list from them, only to then go on to glue that back together into a string. The universally applicable approach is what
japhy already posted:
{ local $/ = undef; $file = <FH> }
This temporarily disables the input record separator, so that a single read will gobble the entire file. Another approach which I like even better as it works less "noisily", however is not universally applicable:
sysread FH, $file, -s $filename;
This only works when you know the filename and have the filehandle positioned at the start of the file, but is the ideal approach when these prerequisites are fulfilled.
Makeshifts last the longest.