in reply to code that runs at module loading

You can make sure variable initialization code is executed at compile time with either a BEGIN{} block or with use constant . . ..

Your initialization code itself looks fine to me. Even if there is a clever way to generate some of the pairs, it's probably better to avoid anything tricky. Init code is only run once. That opinion might change if there are a gazillion pairs in the hash.

After Compline,
Zaxo