How can I iterate over this three level hash printing the results as Hour\tCell\tHEH_Type\HEH_Count
$VAR1 = { '00' => { '875' => { 'CDM 1, CCU 1, CE 5' => '1' }, '13' => { 'CDM 1, 2, CBR 2, 5MHz' => '6' }, '830' => { 'CTRM' => '2' }, '983' => { 'CDM 1, CCU 2, NO ACCESS' => '1', 'CTRM' => '2', 'CDM 1, CCU 1, NO ACCESS' => '1' }, '818' => { 'CTRM' => '3' } } }; The guts of my program so far is: #!/usr/bin/perl use warnings; use strict; use Data::Dumper; use diagnostics; my %CELL; my %CELL_TYPE_COUNT; my $timestamp; my $hour; while (my $line = <>) { if ($line =~ m|\d{1,2}/\d{1,2}/\d{2} ((\d{1,2}):\d{1,2}:\d{1,2})|) { $timestamp = $1; $hour = $2; } if ($line =~ /CELL\s*(\d+)\s*(.*),\s*HEH/) { if ((0 <= $hour)&&($hour <=23)) { $CELL{$hour}{$1}{$2}++; $CELL_TYPE_COUNT{$2}++; } } } # header print "HOUR\tCELL\tHEH_TYPE\tHEH_COUNT\n"; # body foreach my $hour (sort {$a <=> $b} keys %CELL){ foreach my $cellNo (sort {$a <=> $b} keys %{$CELL{$hour}}) { print "$hour\t $cellNo\t"; foreach my $hehCount (keys %CELL_TYPE_COUNT) { if (exists $CELL{$hour}{$cellNo}{$hehCount}) { print "\t $CELL{$hour}{$cellNo}{$hehCount}"; } } print "\n"; } } print Dumper \%CELL; print Dumper \%CELL_TYPE_COUNT;