NAME
Getopt::ApacheCommonsCLI - Perl extension for parsing arguments similar to Apache Commons CLI Java library.
SYNOPSIS
DESCRIPTION
Getopt::ApacheCommonsCLI - Perl extension for parsing arguments similar to Apache Commons CLI Java library.
use Getopt::ApacheCommonsCLI qw(GetOptionsApacheCommonsCLI);
http://commons.apache.org/proper/commons-cli/
The Apache Commons CLI Java library implements options parsing according to at least 3 different standards:
- Unix
- POSIX (bundling, enabled with OPTIONS_BUNDLING=1 flag)
- Java (-D options with right-to-left argument precedence, enabled with JAVA_DOPTS=1)
Certainly there will be parsing ambiguities. An example is that single-character option bundling and non-spaced single-character option args can be parsed in multiple ways for the same input.
If you need 100% compatibility, then it would be advisable to use the original Apache Commons CLI Java library. However, if "pretty close" is adequate, then use this module, or consider submitting a bug report or patch.
Also, as the Getopt::Long module says, "Note: Using option bundling can easily lead to unexpected results, especially when mixing long options and bundles. Caveat emptor."
Here are some definitions for the purpose of this module:
- 'single-character option' (ie. -a)
- 'long option' is the longest option name or alias for an option (ie. --password)
- 'short option' is the shortest option name or alias for an option (usually a single-character option) (ie. -pw)
- 'Java option' is a single-character option starting with '-D' or '--D' and contains '=' (ie. -Dabc=xyz)
- 'bundling' is combining multiple single-character options after a single dash or double dash. (ie. ls -lat)
This Perl module implements:
- options can have both a long and short name
- space or = for trailing option arguments
- allows single-character options to have a non-spaced trailing arg
- options that are seen but don't take an arg have their value set to 1.
- does not enable POSIX single-character options bundling by default, defined in OPTIONS_BUNDLING
- argument assignment precedence is defined in LEFT_TO_RIGHT_ARGS flag, default is from left to right (Java standard is right-to-left)
- Java options parsing is defined with JAVA_DOPTS, default is disabled
- customized error message subroutine for missing args.
For multiple-value arguments, either quote or comma-separate them. Read Getopt::Long documentation for more information.
Input specification format is: "(long-option)|(short-option)[:=]([fios])".
my $result = GetOptionsApacheCommonsCLI(\@spec, \%opts, \%options, \&do_err);
$opts{'__argv__'} is the string remaining after GetOpt::Long processing.
$opts{'__errors__'} is the list of parsing errors.
%options may contain:
AMBIGUITIES (reserved for future use in disambiguating short option names)
BUNDLING (default=0, enabled=1 activates Getopt::Long's bundling_override)
DEBUG (default=0, enabled=1)
JAVA_DOPTS (default=0, enabled=1, implies post-processing with OPT_PREC_RIGHT_TO_LEFT for matching options)
OPT_PRECEDENCE (default=OPT_PREC_UNIQUE, also OPT_PREC_LEFT_TO_RIGHT and OPT_PREC_RIGHT_TO_LEFT)
EXAMPLE
#!/usr/bin/perl
# Program: nodetool_parser.pl
# Purpose: parse command line arguments like Cassandra nodetool to build a mock object for testing
# Author: James Briggs
# Env: Perl5
# Date: 2014 09 25
use strict;
use diagnostics;
use Getopt::ApacheCommonsCLI qw(GetOptionsApacheCommonsCLI OPT_PREC_UNIQUE OPT_PREC_LEFT_TO_RIGHT OPT_PREC_RIGHT_TO_LEFT);
use Data::Dumper;
my $DEBUG = 1;
# input spec format is: "longest-option|(short-option)(:[fios])"
my @spec = ("include-all-sstables|a",
"column-family|cf:s",
"compact|c",
"in-dc|dc:s",
"host|h:s",
"hosts|in-host:s",
"ignore|i",
"local|in-local",
"no-snapshot|ns",
"parallel|par",
"partitioner-range|pr",
"port|p:i",
"resolve-ip|r",
"skip-corrupted|s",
"tag|t:s",
"tokens|T",
"username|u:s",
"password|pw:s",
"start-token|st:s",
"end-token|et:s",
);
my %opts; # output hash with tokenized long options and args
my $result = GetOptionsApacheCommonsCLI(\@spec, \%opts, { DEBUG => $DEBUG, JAVA_DOPTS => 0, OPT_PRECEDENCE => OPT_PREC_UNIQUE, BUNDLING => 1, } , \&do_err) ||
warn "parsing error. see \$opts{__errors__} for a list, ";
print Dumper(\%opts) if $DEBUG;
sub do_err {
my ($option, $value) = @_;
if (not defined $value or $value eq '') {
print "Missing argument for option:$option\n";
}
else {
print "Incorrect value, precedence or duplicate option for option:$option:$value\n";
}
return 0;
}
EXPORT
None by default.
The following symbols can be imported:
GetOptionsApacheCommonsCLI
OPT_PREC_UNIQUE
OPT_PREC_LEFT_TO_RIGHT
OPT_PREC_RIGHT_TO_LEFT
SEE ALSO
Getopt::Long
AUTHOR
James Briggs, <james.briggs@yahoo.com>
COPYRIGHT AND LICENSE
Copyright (C) 2014 by James Briggs
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available.