use Data::Dumper; my %hash; my $sub_length = '.' x 2; $hash{$.-1}=[ grep /$sub_length/o, split /($sub_length)/o ] while ; print Dumper \%hash; __DATA__ ABDCX EFGHX