in reply to I fear my code is unreadable

Probably could be simplified with List::Util's max to something like my $col_width = 2 + max( map length, keys %lists, map( @$_, values %lists ) );.

The cake is a lie.
The cake is a lie.
The cake is a lie.