in reply to Replacing warn/die with carp/croak?

I thought the use of carp/croak was fairly intuitive when I first saw it (after running it to see the output):

For example; At the beginning of a sub, sanity check the input and carp/croak if it is bad (too many, too few, invalid data, wrong reference type, etc). Then roll along, and use warn/die when things the sub does go wrong. If in doubt, warn/die.

The key thing IMO being to make sure that when carp/croaking, the caller knows what you're talking about. If your error message refers to a parameter or lack thereof, carp/croak makes sense.
The Bar() sub could carp/croak with the following message, for example:
"Unmatched parentheses in Parameter 1 at file Foo line 42:  $Answer = Bar('(2+5))*5');"
And that makes perfect sense as an error message.

"Failed to open log file for write" on the other hand, is not the caller's fault. Unless one of your parameters was a filehandle to use as a log, they will have no idea what the message is talking about. If you were passed in a filehandle for that purpose, the message could be better written as
"Log filehandle in Parameter 5 could not be opened for write"