use warnings; use strict; my %analyse; while () { chomp; if ( my ( $animal_type, $animal_name, $animal_color ) = m/.+?([A-Z]).+?__(.+?);.+?__(.+?)?$/ ) { $analyse{$animal_name}{$animal_type}++; $analyse{$animal_color}{$animal_name}{$animal_type}++ if defined $animal_color; } } use Data::Dump; dd \%analyse; __DATA__ occurence1 A a__bear;c__black occurence2 B a__wolf;c__grey occurence3 A a__wolf;c__white occurence4 A a__bear;c__ occurence5 C a__wolf;c__grey occurence6 C a__bear;c__brown occurence7 A a__wolf;c__ occurence8 B a__wolf;c__ occurence9 C a__bear;c__black occurence10 C a__wolf;c__ occurence11 A a__wolf;c__red occurence12 B a__wolf;c__grey occurence13 C a__wolf;c__grey occurence14 C a__wolf;c__grey occurence15 B a__bear;c__brown occurence16 C a__bear;c__brown occurence17 A a__bear;c__ occurence18 A a__bear;c__brown occurence19 C a__wolf;c__white occurence20 B a__wolf;c__grey occurence21 B a__bear;c__ occurence22 B a__wolf;c__grey occurence23 A a__wolf;c__grey occurence24 A a__bear;c__brown occurence25 C a__bear;c__brown occurence26 A a__bear;c__brown occurence27 C a__bear;c__ occurence28 C a__bear;c__brown occurence29 B a__wolf;c__red occurence30 B a__wolf;c__grey #### { bear => { A => 6, B => 2, C => 6 }, black => { bear => { A => 1, C => 1 } }, brown => { bear => { A => 3, B => 1, C => 4 } }, grey => { wolf => { A => 1, B => 5, C => 3 } }, red => { wolf => { A => 1, B => 1 } }, white => { wolf => { A => 1, C => 1 } }, wolf => { A => 4, B => 7, C => 5 }, } #### $analyse{$animal_color}{$animal_name}{$animal_type}++ if defined $animal_color; #### $analyse{$animal_color}{$animal_type}++ if defined $animal_color; #### { bear => { A => 6, B => 2, C => 6 }, black => { A => 1, C => 1 }, brown => { A => 3, B => 1, C => 4 }, grey => { A => 1, B => 5, C => 3 }, red => { A => 1, B => 1 }, white => { A => 1, C => 1 }, wolf => { A => 4, B => 7, C => 5 }, }