You might find Lingua::EN::NameCase useful. It includes support for quite a few of the special rules for name capitalization. A quick search on the code seems to indicate it wouldn't handle 'brian d foy' correctly though!
--Brian
Comment on Re^3: Splitting/joining on different characters