A way to better print the data structure during development and debug (and when communicating with your fellow monks) is to properly use structure dumping tools like Data::Dumper and Data::Dump. For instance, you show one dump as

which suggests a statement like print Dumper %hash;
was used to generate it. This use of Dumper and its siblings and cousins such as dd in Data::Dump flattens out the top-level key/value pairs of the hash into a representation that quickly becomes incomprehensible, IMHO, for large structures (although I think dd does a bit better with it than Dumper).

Properly passing the structure by reference leads to a much more comprehensible representation. Ferinstance: