in reply to Non-greedy substitution

You don't need to use a regex here. Here's a function I use frequently:
sub name_join { return '' unless @_; return $_[0] if 1 == @_; return join ', ', @_[0 .. $#_ - 2], "$_[-2] and $_[-1]"; }