in reply to pattern matching to separate data

This looks like homework to me so I'll make suggestions rather than code

1) Filehandles can be stored in variables too:

my ($fh1, $fh2); open $fh1, ">GENEID.out" or ... open $fh2, ">PROTID.out" or ...

2) Read every line - print every line. You are obviously not doing that.

3) set another Filehandle var '$fh' with the appropriate Filehandle as you detect a change and use your new $fh to store and print to the right file.