in reply to Variable number of words/fields in a line/record

You seem to have received some useful help for the main part of your script, the bit that actually does the useful stuff. ++ to Arguile for his clear analysis of the your data & its effect on your program. So I'll just be pedantic and mention my pet peeve:
open IN, "$in" || die "$!\n"; # Incorrect open OUT, ">$out" or die "$!\n"; # This is OK
You must use or rather than || in short-circuit error checks after calls to open, close etc. unless you put parens around their parameters. If you don't, the die (or whatever is after the ||) will never be executed. See Re: (boo) debug-fu! for a slightly longer explanation.