The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

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.