my (%old, %new); ... for my $printer (sort keys %old) { print("Printer $printer not in new\n"), next unless exists $new{$printer}; for my $name (sort keys %{$old{$printer}}) { print("Attribute $name not in new for printer $printer\n"), next unless exists $new{$printer}{$name}; for my $val (sort keys %{$old{$printer}{$name}}) { print("Val $val not in new for printer $printer attrib $name\n"), next unless exists $new{$printer}{$name}{$val}; } } } # Then do the reverse comparision looping over %new # I'm sure you can figure that out