Quick Hints for the Getopt::Long perl module
Getopt::Long is a valuable perl module that provides functionality for processing command line options.
The pod for Getopt::Long is helpful, but I want a handy reference for some usages that I forget.
Option variants
- Negatable
This allows --foo to negated with --nofoo:
GetOptions('foo!' => \$foo);
- Incrementable
This allows an option to contain a scalar and for the value to be incremented each time the option appears on the command line:
GetOptions('foo+' => \$foo);
- Options with values
Options can be specified that take values which may be integer numbers, floating point numbers or strings (i, f, s, respectively). Options that require values are specified with =, options that may or may not take values are specified with a colon:
GetOptions('foo:i' => \$foo, ' bar=f' => \$bar, 'baz:s' => \$baz );
The above example specifies an option 'foo' that may be given an integer value, an option 'bar' that must be given a floating point value and an option 'baz' that may be given a string value. If no suitable value is supplied, string valued options get an empty string '' assigned, while numeric options are set to '0'. Here are some valid invocations:
--foo --bar 7.2 --baz bazvalue --foo=7 --baz=bazvalue
- Options with multiple values
Options can be specified to take multiple values by making the desination variable an array (or an arrayref).:
GetOptions('foo=i' => \@foos); --foo 2 --foo 5
Allowing the multiple values to be given as a comma-separated list is usually a good idea.:
GetOptions ("foo=i" => \@foos); @foos = split(/,/,join(',',@foos)); --foo=2,5
Default values
As usual in perl, TIMTOWTDI applies, but I sometimes use the following idiom for default values:
$options = GetOptions( ... ); $foo = defined($foo) ? $foo : 1; $bar = defined($bar) ? $bar : 'default value for bar';
Other notes
Sometimes, it is convenient to have a hash as the option destination; I like this approach when building a module, because it makes it easier too pass the data around in its entirety.:
my %options; GetOptions(\%options, "foo=s", "debug", "help|?", "verbose|v+", ); if ($options{'help'}) { usage(); } $options{'foo'} = defined($options{'foo'} ? $options{'foo'} : 'default value for foo';
If you want to use the above style AND have multiple values for an option, it will be need to be specified using an alternative syntax:
GetOptions(\%options, "foo=s@", ); @foos = split(/,/,join(',',@options{'foo'}));
As I have used above, but worth explicitly stating, these are both valid usages:
--foo=foovalue --foo foovalue
I gained some insight from the docs, some from the author, some from more on getopt and configuration and some from painful practice.