use strict; use warnings; use Data::Dumper; my %all_entry; while () { chomp; next unless (/^>/); my $line = $_; while ($line =~ /GI\=(\d+)\,(\w+)\,(\d+\-\d+)/g){ push @{ $all_entry{$1}{$2} }, $3; } } print Dumper \%all_entry; output: ------- $VAR1 = { '162960844' => { 'bw' => [ '0-4', '9025576-9025608' ] }, '152989753' => { 'bw' => [ '0-30', '1877925-1877931' ] } };