If you had
at the top of your code, it would have pointed out your problem, with the message:
Use of uninitialized value in list assignment at ..
(This comes from 'use warnings;')
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."