Maybe you could explicitly match spaces in the replacement
(instead of whitespace). Or chomp off the newline first and
then append it back on when you're done with the whitespace -> tab
substition. If I understood the problem correctly, that is...

Your regular expression: $line =~ s/ s{2,}/\t/s is converting " ss" and " ssss" to tabs and it is only converting the first one because you don't have a global flag at the end. To replace the tabs you would need s/\s\s+/\t/g or s/\s{2,}/\t/g. Note the backslash before the "s".

As for keeping the final newline, I would recommend stripping it before you apply the regex and adding it after you are done. There are ways to do that with regular expressions alone but your regular expression would be quite complicated. So the code to prep the line should look something like this:

Your issue here arises from the fact you are starting with a fixed-width file, not a white-space delimited file - the latter cannot contain a null column with its body by construction.

You can roll your own solution using substr or pack/unpack. However, it's probably a good idea to turn to CPAN and use one of the many fixed width parsing modules available (e.g. search terms fixedwidth, fixedlength).

Update: You reposted the problem outside this thread here. You shouldn't break threads unnecessarily, and you really shouldn't double post.

When putting a smiley right before a closing parenthesis, do you:

Use two parentheses: (Like this: :) )
Use one parenthesis: (Like this: :)
Reverse direction of the smiley: (Like this: (: )
Use angle/square brackets instead of parentheses
Use C-style commenting to set the smiley off from the closing parenthesis
Make the smiley a dunce: (:>
I disapprove of emoticons
Other