NAME

Getopt::Easy - parses command line options in a simple but capable way.

SYNOPSIS

use Getopt::Easy;

get_options "v-verbose  f-fname=  D-debug=uSX",
            "usage => "usage: prog [-v] [-f fname] [-D [uSX]] [-H]",
            "H";

print "reading $O{fname}\n" if $O{verbose};
print "SQL: $sql\n" if $O{debug} =~ /S/;

DESCRIPTION

Perl puts the command line parameters in the array @ARGV allowing the user to examine and manipulate it like any other array. There is a long tradition of putting optional single character flags (preceded by a dash) in front of other parameters like so:

% ls -ltr *.h *.c
% tar -tvf all.tar
% ps -ax -U jsmith

Many Getopt::* modules exist to help with the parsing of these flags out of @ARGV. For the author, Getopt::Std was visually too cryptic and Getopt::Long was too large and complex for most normal applications. Getopt::Easy is small, easy to understand, and provides a visual clarity.

There are two things exported: get_options() and %O.

get_options has 1 required parameter and 2 optional ones. The first is a string describing the kind of options that are expected. It is a space separated list of terms like this:

get_options "v-verbose   f-fname=";

If the -v option is given on the command line %O{verbose} will be set to 1 (true). If the -f option is given then another argument is expected which will be assigned to $O{fname}.

Before parsing @ARGV, $O{verbose} will be initialized to 0 (false) and $O{fname} to "" (unless they already have a value).

If you give an unknown option get_options() will complain and exit:

% prog -vX
unknown option: -X
%

These conventions are implemented by Getopt::Easy:

  • The options can come in any order.

  • Multiple boolean options can be bundled together.

  • A command line argument of '--' will cause argument parsing to stop so you can parse the rest of the options yourself.

  • Parsed arguments are removed from @ARGV.

These invocations are equivalent:

% prog -v -f infile
% prog -f infile -v     # different order
% prog -v -finfile
% prog -vf infile
% prog -vfinfile

This shows that the space between -f and infile is optional and that you can bundle -f with -v but -f must be the last option in the bundle.

The optional second parameter to get_options() is a usage message to be printed when an illegal option is given.

get_options "v-verbose   f-fname=",
            "usage: prog [-v] [-f fname]";

Now if an unknown option is given, the same error message will be printed, as above, followed by the usage message.

% prog -vX
unknown option: -X
usage: prog [-v] [-f fname]
%

HELP

Sometimes the usage message is not enough and the user needs more detailed and elaborate help. This is where the 3rd optional parameter comes in.

get_options "v-verbose   f-fname=",
            "usage: prog [-v] [-f fname] [-H]",
            "H";

Giving the -H option will cause the POD for the module to be echoed to STDOUT - as if the user had typed 'perldoc prog'. See 'perldoc perlpod'.

DEBUGGING

There are various ways to implement a debugging option:

GOOD:

get_options "d-debug";

print "val = $val\n" if $O{debug};

BETTER:

get_options "d-debug=";

print "SQL = $sql\n" if $O{debug} >= 2;
print "val = $val\n" if $O{debug} >= 3;

With this method there are various levels of debugging. Unfortunately, they often end up ranging from 'not enough' to 'too much' :(.

BEST:

 get_options "d-debug=eSvL";

 print "SQL = $sql\n" if $O{debug} =~ /S/;
 print "val = $val\n" if $O{debug }=~ /v/;

With this kind of term the letters after the equal sign '=' are the debugging options that are valid. Now the user can choose exactly what kind of debugging output they wish to see.

% prog -d SL

Giving an illegal debugging option will result in an error message:

% prog -deXSf
for -d: illegal options: Xf, valid ones are: eSvL
%

ACCESS ELSEWHERE

If you want access to the %O hash from other files simply put:

use Getopt::Easy;

at the top of those files; the %O hash will again be exported into the current package. You need to have:

get_options ...;

only once in the main file before anyone needs to look at the %O hash.

STRICT

It is easy to misspell a key for the %O hash. Tie::StrictHash can help with this:

use GetOpt::Easy;
use Tie::StrictHash;

get_options "v-verbose  f-fname=";
strict_hash %O;

print "file name is $O{filename}\n";

This will give a fatal error message:

key 'filename' does not exist at prog line 6

SEE ALSO

Config::Easy allows configuration file entries to be overidden with command line arguments.

Tie::StrictHash protects against misspelling of key names.

Date::Simple is an elegant way of dealing with dates.

AUTHOR

Jon Bjornstad <jon@icogitate.com>