If you had
in reply to Re^2: Hash of arrays
in thread Hash of arrays
at the top of your code, it would have pointed out your problem, with the message:
(This comes from 'use warnings;')
Use of uninitialized value in list assignment at ..
There is overwhelming agreement here that those two directives should be at the top of EVERY script you write, and you have just experienced an instance where it could have saved days of questioning and struggle.
"By three methods we may learn wisdom: First, by reflection, which is noblest; Second, by imitation, which is easiest; and third by experience, which is the bitterest."