perl -wMstrict -le "sub standard_commas { return @_ == 0 ? '' : @_ == 1 ? qq($_[0]) : @_ == 2 ? qq($_[0] and $_[1]) : join ', ', shift, standard_commas(@_) } sub oxford_commas { return @_ <= 2 ? standard_commas(@_) : @_ == 3 ? qq($_[0], $_[1], and $_[2]) : join ', ', shift, oxford_commas(@_) } 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" "a c d e f" 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 for words: a c d e f standard commas: a, c, d, e and f oxford commas: a, c, d, e, and f