!/usr/bin/perl -w use strict; my $switch_hash = { 'Washington' =>{uslecwas5e1 =>{'01-AUG-2002' => '' }}, 'Charleston' =>{uslecchst5e1 =>{'01-AUG-2002' => '' }}, 'Richmond' =>{uslecric5e1 =>{'01-AUG-2002' => '' }}, 'West Palm Beach'=>{uslecwpb5e1 =>{'01-AUG-2002' => '' }}, 'Atlanta' =>{uslecatl5e1 =>{'14-AUG-2002' => '10:reason', '15-AUG-2002' => '11:new reason' }}, 'Fort Myers' =>{uslecftm5e1 =>{'01-AUG-2002' => '' }}, 'Mobile' =>{uslecmob5e1 =>{'01-AUG-2002' => '' }}, 'Nashville' =>{uslecnas5e1 =>{'01-AUG-2002' => '' }}, 'Orlando' =>{uslecorl5e1 =>{'12-AUG-2002' => '2:different reason' }}, 'Charlotte' =>{uslechar5e1 =>{'01-AUG-2002' => '' }}, 'Louisville' =>{usleclou5e1 =>{'01-AUG-2002' => '' }}, 'Memphis' =>{uslecmem5e1 =>{'01-AUG-2002' => '' }}, 'Philadelphia' =>{uslecphi5e1 =>{'01-AUG-2002' => '' }}, 'Chattanooga' =>{uslecchat5e1 =>{'01-AUG-2002' => '' }}, 'Birmingham' =>{uslecbir5e1 =>{'01-AUG-2002' => '23:junk' }}, 'Greensboro' =>{uslcgb5e2sm =>{'01-AUG-2002' => '' }}, 'New Orleans' =>{uslecnew5e1 =>{'01-AUG-2002' => '22:fake' }}, 'Jacksonville' =>{uslecjac5e1 =>{'01-AUG-2002' => '' }}, 'Norfolk' =>{uslecnor5e1 =>{'01-AUG-2002' => '' }}, 'DEX' =>{chrdex =>{'13-AUG-2002' => '1:some stuff', '19-AUG-2002' => '1:reason again' }}, 'Atlanta II' =>{uslecat25e1 =>{'01-AUG-2002' => '' }}, 'Baltimore' =>{uslecbal5e1 =>{'01-AUG-2002' => '' }}, 'Raleigh' =>{uslecral5e1 =>{'01-AUG-2002' => '' }}, 'Pittsburgh' =>{uslecpit5e1 =>{'01-AUG-2002' => '' }}, 'Miami' =>{uslecmia5e1 =>{'01-AUG-2002' => '' }}, 'Knoxville' =>{uslecknxv5e =>{'01-AUG-2002' => '' }}, 'Tampa' =>{uslectam5e1 =>{'01-AUG-2002' => '' }}, }; my %reasons; while ( my ($city, $v1) = each %$switch_hash ){ while ( my ($usl, $v2) = each %$v1 ){ while ( my ($date, $v3) = each %$v2 ){ next unless $v3; my ($hours, $reason) = split ':', $v3, 2; warn if exists $reasons{"$city:$date"}; $reasons{"$city:$date"} = $reason; # push @reasons, [$city, $date, $reason ]; $v2->{$date} = $hours; # Can't use $v3 here; it is a copy! } } } use Data::Dumper; $Data::Dumper::Useqq = 1; print Data::Dumper->Dump( [ \%reasons, $switch_hash ], [qw( *reasons switch_hash )] );