perl -wMstrict -le "sub standard_commas { return @_ == 0 ? '' : @_ == 1 ? qq{$_[0]} : join q{, }, @_[0 .. $#_ - 2], qq{$_[-2] and $_[-1]} } sub oxford_commas { return @_ < 3 ? standard_commas(@_) : join q{, }, @_[0 .. $#_ - 1], qq{and $_[-1]} } for (@ARGV) { my @words = split; print qq(\nfor words: @words); print 'standard commas: ', standard_commas(@words); print ' oxford commas: ', oxford_commas(@words); } " "" "a" "a b" "a b c" "a b c d" "a b c d e" for words: standard commas: oxford commas: for words: a standard commas: a oxford commas: a for words: a b standard commas: a and b oxford commas: a and b for words: a b c standard commas: a, b and c oxford commas: a, b, and c for words: a b c d standard commas: a, b, c and d oxford commas: a, b, c, and d for words: a b c d e standard commas: a, b, c, d and e oxford commas: a, b, c, d, and e