use warnings; use strict; use Data::Dumper; my %hash = ( 'Alarms.Alarm Acknowledge' => { 'ScreenName' => 'Alarms', 'Description' => 'Alarm Acknowledge', 'Type' => 'On/Off' }, 'Flow Diagram.Sequence Hold' => { 'ScreenName' => 'Flow Diagram', 'Description' => 'Sequence Hold', 'Type' => 'Momentary' }, 'Flow Diagram.Sequence Advance' => { 'ScreenName' => 'Flow Diagram', 'Description' => 'Sequence Advance', 'Type' => 'Momentary' }, 'Flow Diagram.Sanitize Enable/Disable' => { 'ScreenName' => 'Flow Diagram', 'Description' => 'Sanitize Enable/Disable', 'Type' => 'On/Off' }, 'Trend to USB.Start/Stop Trend Toggle' => { 'ScreenName' => 'Trend to USB', 'Description' => 'Start/Stop Trend Toggle', 'Type' => 'On/Off' }, 'Alarms.Alarm Reset' => { 'ScreenName' => 'Alarms', 'Description' => 'Alarm Reset', 'Type' => 'On/Off' }, 'Alarms.Alarm Trigger' => { 'ScreenName' => 'Alarms', 'Description' => 'Alarm Trigger', 'Type' => 'Momentary' }, ); print Dumper(%hash); print "\n\n\n"; my %ScreenNameCount; $ScreenNameCount{$hash{$_}{ScreenName}}++ foreach keys %hash; my %HashCount; my $Screenkey = 'New'; my $ScreenkeyOld = 'Old'; my @List; my $i = 1; foreach my $key (sort keys %hash) { my $Screenkey = $hash{$key}{'ScreenName'}; my $Description = $hash{$key}{'Description'}; my $Type = $hash{$key}{'Type'}; $HashCount{$Screenkey} = $Screenkey; $HashCount{$Screenkey}= {0 => $ScreenNameCount{$Screenkey}}; if ($Screenkey eq $ScreenkeyOld) { $HashCount{$Screenkey} = {$i => "\\t \\t \\t \\t\& \\mytabhead{$Description} \\t\& $Type \\t\\\\ \\hline \\n $i - $Screenkey - $ScreenkeyOld"}; $i++; } else { $HashCount{$Screenkey} = {$i => "\\mytabhead{$Screenkey} \\t\& \\mytabhead{$Description} \\t\& $Type \\t\\\\ \\hline \\n $i - $Screenkey - $ScreenkeyOld"}; $i=1; } $ScreenkeyOld = $Screenkey; } print "\n\n\n"; print Dumper(%HashCount); print "\n\n\n"; print Dumper \%ScreenNameCount; print "\n\n\n";