#!/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;