$line = <$fh>;
はファイルハンドルから$/の値まで($/の値を含む)を
取り出しますが
$/は通常\n(0a)に設定されてますよね?

で、この状態でバイナリファイルを読み込んだら当然
バイナリファイル中の0aで区切られますが、そのバイナリ
ファイル中の0aの出現頻度はばらばらで、たとえば
binmode($fh);
@line = <$fh>;

としたら@line中の各要素の長さは皆ばらばらになってしまいます
かといってslurpしちゃうのはバイナリなんでありえないです

ということで、バイナリを読み込むときってsysreadとかreadじゃ
なきゃだめなの?

なんとか普通の<>の形式でやる方法ってないですか?