in reply to old 2D hash construct

You're right about the 2D hash mechanism, and right that a HoH should be used instead, in general.

in the section on "$;" (or "$SUBSEP" in english) in perlvar it says

If you refer to a hash element as

$foo{$a,$b,$c}

it really means

$foo{join($;, $a, $b, $c)}

The place where it's still useful is if you are storing the hash in a database, and it sounds like your legacy code might be doing this. The caution is that you can't have data the same as the separator, so binary data needs to be escaped in some way.

Personally, I would change these the form to ' $hash{$key1 . $; . $key2}' to let people know what was going on a little better.