Another alternative using Tie::File::AnyData::Bio::Fasta:
use strict;
use warnings;
use Fcntl qw/:DEFAULT/;
use Tie::File::AnyData::Bio::Fasta;
tie my @arr, 'Tie::File::AnyData::Bio::Fasta', 'input.txt' or die $!;
tie my @geneids, 'Tie::File::AnyData::Bio::Fasta', 'GENEID.out',mode =
+> O_RDWR | O_CREAT or die $!;
tie my @protids, 'Tie::File::AnyData::Bio::Fasta', 'PROTID.out',mode =
+> O_RDWR | O_CREAT or die $!;
@geneids = grep {/GENEID/} @arr;
@protids = grep {/PROTID/} @arr;
untie @arr;
untie @geneids;
untie @protids;