use Modern::Perl; use Data::Dump qw/dump/; my %acn_database; while () { last if /END/; my ($acn, $orfname) = split /\sORFNames=|\s/; $acn_database{$acn} = [$orfname]; } while () { my ($acn, @pf_data) = split /\s\|\s|\s/; push @{$acn_database{$acn}}, @pf_data; } say dump(\%acn_database); __DATA__ Q197F8 ORFNames=IIV3-002R Q197F7 ORFNames=IIV3-003L Q6GZX2 ORFNames=FV3-003R Q6GZX1 ORFNames=FV3-004R Q197F5 ORFNames=IIV3-005L Q6GZX0 ORFNames=FV3-005R ;PF02393 Q91G88 ORFNames=IIV6-006L ;PF12299;PF04383 Q6GZW9 ORFNames=FV3-006R END Q197F8 | PF04947.9 Q91G88 | PF01486.12 PF00319.13