Build a hash from ARGV, the Ruby way

I would like to build a hash from ARGV using UNIX type notation ie any
argument which begins with a hyphen or double hyphen is an option and
may have as value(s) the argument(s) which succeed it (if they don’t
have hyphens). Options without values should result in a hash element
which has a key and a dummy value (say “0”).

I suspect/hope there is a very simple “Ruby way” to do this, but I got
stuck thinking how to look ahead when iterating through ARGV. I’ve got
a bodged method of just taking pairs eg -a 1 -b 0 -c 3 etc, but it would
be nice to it properly. Any suggestions? All help appreciated!

On Jan 25, 6:00 pm, Toby R. [email protected] wrote:

I would like to build a hash from ARGV using UNIX type notation ie any
argument which begins with a hyphen or double hyphen is an option and
may have as value(s) the argument(s) which succeed it (if they don’t
have hyphens). Options without values should result in a hash element
which has a key and a dummy value (say “0”).

I suspect/hope there is a very simple “Ruby way” to do this, but I got
stuck thinking how to look ahead when iterating through ARGV. I’ve got
a bodged method of just taking pairs eg -a 1 -b 0 -c 3 etc, but it would
be nice to it properly. Any suggestions? All help appreciated!

$ gem install facets
$ irb

require ‘facets/argvector’
argv = Argvector.new(“-a 0 -b 0 -c 3”)
argv.options

Toby R. wrote:

I would like to build a hash from ARGV using UNIX type notation ie any
argument which begins with a hyphen or double hyphen is an option and
may have as value(s) the argument(s) which succeed it (if they don’t
have hyphens). Options without values should result in a hash element
which has a key and a dummy value (say “0”).

Take a look at optparse.rb in the standard ruby library:
http://ruby-doc.org/stdlib/libdoc/optparse/rdoc/classes/OptionParser.html

Then if you don’t like that, there are several other libraries that
other people have written with more “object like” APIs and very
forgettable names. One I came across recently was thor:

Brian C. wrote:

Then if you don’t like that, there are several other libraries that
other people have written with more “object like” APIs and very
forgettable names.

http://www.rubyinside.com/trollop-command-line-option-parser-for-ruby-944.html

(and some other alternatives are given in the body and the comments)

Reformatted excerpts from Toby R.'s message of 2010-01-25:

I suspect/hope there is a very simple “Ruby way” to do this, but I got
stuck thinking how to look ahead when iterating through ARGV. I’ve
got a bodged method of just taking pairs eg -a 1 -b 0 -c 3 etc, but it
would be nice to it properly. Any suggestions? All help appreciated!

You can start doing something simple with ARGV.each_slice(2), but any
kind of error checking quickly gets complicated. Trollop will do this
exact thing for you (turn ARGV into a hash with error checking).