#!/usr/bin/env perl use strict; use warnings; my %hash = ( 'ScreenName1.Description1' => { 'ScreenName' => 'A', 'Description' => 'Desc1', 'Type' => 'On/Off' }, 'ScreenName2.Description2' => { 'ScreenName' => 'B', 'Description' => 'Desc2', 'Type' => 'Momentary' }, 'ScreenName3.Description3' => { 'ScreenName' => 'A', 'Description' => 'Desc3', 'Type' => 'Momentary' }, 'ScreenName4.Description4' => { 'ScreenName' => 'A', 'Description' => 'Desc4', 'Type' => 'On/Off' }, 'ScreenName5.Description5' => { 'ScreenName' => 'B', 'Description' => 'Desc5', 'Type' => 'On/Off' }, ); my %parsed; for (values %hash) { push @{$parsed{$_->{ScreenName}}}, join ' ', @{$_}{qw{Description Type}}; } print "*** Counts ***\n"; print "$_ - ", 0+@{$parsed{$_}}, "\n" for keys %parsed; print "\n*** New hash (\%parsed) ***\n"; use Data::Dump; dd \%parsed; #### *** Counts *** A - 3 B - 2 *** New hash (%parsed) *** { A => ["Desc1 On/Off", "Desc3 Momentary", "Desc4 On/Off"], B => ["Desc2 Momentary", "Desc5 On/Off"], } #### *** Counts *** B - 2 A - 3 *** New hash (%parsed) *** { A => ["Desc3 Momentary", "Desc1 On/Off", "Desc4 On/Off"], B => ["Desc5 On/Off", "Desc2 Momentary"], }