in reply to exists and defined functions

As pointed out by rob_au, you can use exists on an array in Perl 5.6 or better. If you're forced to use something as antiquated as 5.005, then consider this:
print "+$exp[1]" if ($#exp >= 1);
The element at index 1 may be undef, though, and give you warnings.

The point of your question, though, is to get these listed properly. What about something simpler, such as this:
print DATA join('+', $month, @exp, $hoursworked)."\n";
This will put plus signs between any values in @exp. I think join is a much better solution than a whole whack of print statements.

Just a few other remarks too: