Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: Module for making english lists?

by AnomalousMonk (Archbishop)
on Aug 26, 2008 at 00:02 UTC ( [id://706805]=note: print w/replies, xml ) Need Help??


in reply to Module for making english lists?

FWIW:

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

Replies are listed 'Best First'.
Re^2: Module for making english lists?
by AnomalousMonk (Archbishop) on Aug 26, 2008 at 04:44 UTC
    Or, shorter, sweeter and non-recursive (and kind of a restatement of Your Mother's contribution):

    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
      And, since I don't seem to be able to let this go, still shorter and sweeter:

      sub standard_commas { return join q{, }, @_ < 2 ? @_ : (@_[0 .. $#_ - 2], qq{$_[-2] and $_[-1]}) } sub oxford_commas { return join q{, }, @_ < 3 ? goto &standard_commas : (@_[0 .. $#_ - 1], qq{and $_[-1]}) }
      Tested. The output, which I won't inflict upon you again, is the same.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://706805]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others imbibing at the Monastery: (2)
As of 2024-04-26 07:45 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found