Getopt-Tree

 view release on metacpan or  search on metacpan

README  view on Meta::CPAN

     # Accept the commands add, remove, print, and their associated dependent
     # options.
     my $p = [
         {
             name     => 'add',
             exists   => 1,
             descr    => 'Add a new route',
             params   => [
                 {
                     name => 'gateway',
                     abbr => 'gw',
                     descr => 'Remote gateway for this network',
                 },
                 {
                     name => 'network',
                     abbr => 'net',
                     descr => 'Network address to add route for',
                 },
                 {
                     name => 'subnet',
                     abbr => 'mask',
                     descr => 'Subnet mask for the given network',
                 },
             ],
         },
         {
             name     => 'remove',
             abbr     => 'delete',
             exists   => 1,
             descr    => 'Delete a route',
             params   => [
                 {
                     name => 'network',
                     abbr => 'net',
                     descr => 'Network address to delete',
                 },
                 {
                     name => 'subnet',
                     abbr => 'mask',
                     descr => 'Subnet mask for the given network',
                 },
             ],
         },
         {
             name     => 'print',
             exists   => 1,
             descr    => 'Display routing table',
         }, 
     ];

  Complex example
     my $p = [
         # Required global parameter.
         { name => 'user', leaf => 1, eval => sub { my ( $p ) = @_; return 1 if $p =~ /^[a-z]+$/i; },
         # Optional global parameter.
         {
             name     => 'no-cache',
             abbr     => 'nc',
             exists   => 1,
             optional => 1,
             descr    => 'Don\'t cache your credentials in /tmp/.'
         },
         # Start of a branch. If one or more branches exist, at least one must be
         # followed.
         {
             name   => 'search',
             abbr   => 's',
             descr  => 'Search for ticket, list tickets in queue, or print contents of a ticket.',
             params => [
                {
                     name   => 'ticket', # field name
                     abbr   => 't',      # alternate name  
                     re     => TICKET_REGEX, # field must match re
                     descr  => 'The ticket number to search for.', # auto-doc
                     params => [
                         { # fields that are allowed if this field is set
                             name     => 'show-all-worklog-fields',
                             exists   => 1, # I just want a 1 or a 0 if set
                             optional => 1,
                             descr    => 'Show all worklog fields.'
                         },
                         {
                             name     => 'show-all-fields',
                             multi    => 1, # can be set multiple times, returns arrayref
                             exists   => 1, # unless exists is set too, then you just get the count
                             descr    => 'Show all ticket fields.'
                         },
                     ],
                },
             ],
         }
     ];
     my ( $operation, $params ) = parse_command_line( $p );
     if ( !$operation ) { print_usage( $p ); die; }
     print "Performing $operation!\n"

USAGE
    Two functions are exported by default: parse_command_line and
    print_usage.

  Functions
   parse_command_line
    Parses the command line (@ARGV) based on the specified data structure.

    Accepts two parameters. The first is a required array reference
    describing the possible command line parameters. It returns three
    values, the "top level" option, a hashref of the other specified
    options, and an arrayref of any remaining unparsed options (similar to
    Getopt::Long).

    The second parameter is an optional array reference or string from which
    the parameters are to be read, rather than reading them from @ARGV. If a
    string is passed, it will be converted to an array via
    "Text::ParseWords::shellwords".

    If the command line was unable to be parsed (the passed data structure
    was inconsistent, etc), parse_command_line will die with an appropriate
    error message. If the command line was invalid (the user entered
    something that did not meet the given requirements, etc) a warning will
    be printed and undef will be returned.



( run in 0.834 second using v1.01-cache-2.11-cpan-140bd7fdf52 )