Another possibility might lie in the way you're calling your subs.
when you call a sub using &sub_name, it passes @_ in a global fassion, meaning any changes to @_ are affected throughout the script. My explanation may be slightly off on that, but if you're going to call your subs using & with no args, it's safer to pass an empty set to it using ().. i.e. call &sub_name() rather than &sub_name
Without seeing the code, i dont' know if that's the case or not, but i do know you'll eventually run into problems calling subs like that.