NAME
Getopt::Long::Subcommand - Process command-line options, with
subcommands and completion
VERSION
This document describes version 0.103 of Getopt::Long::Subcommand (from
Perl distribution Getopt-Long-Subcommand), released on 2019-02-27.
SYNOPSIS
use Getopt::Long::Subcommand; # exports GetOptions
my %opts;
my $res = GetOptions(
summary => 'Summary about your program ...',
# common options recognized by all subcommands
options => {
'help|h|?' => {
summary => 'Display help message',
handler => sub {
my ($cb, $val, $res) = @_;
if ($res->{subcommand}) {
say "Help message for $res->{subcommand} ...";
} else {
say "General help message ...";
}
exit 0;
},
'version|v' => {
summary => 'Display program version',
handler => sub {
say "Program version $main::VERSION";
exit 0;
},
'verbose' => {
handler => \$opts{verbose},
},
},
# list your subcommands here
subcommands => {
subcmd1 => {
summary => 'The first subcommand',
# subcommand-specific options
options => {
'foo=i' => {
handler => \$opts{foo},
},
},
},
subcmd1 => {
summary => 'The second subcommand',
options => {
'bar=s' => \$opts{bar},
'baz' => \$opts{baz},
},
},
},
# tell how to complete option value and arguments. see
# Getopt::Long::Complete for more details, the arguments are the same
# except there is an additional 'subcommand' that gives the subcommand
# name.
completion => sub {
my %args = @_;
...
},
);
die "GetOptions failed!\n" unless $res->{success};
say "Running subcommand $res->{subcommand} ...";
To run your script:
% script
Missing subcommand
% script --help
General help message ...
% script subcmd1
Running subcommand subcmd1 ...
% script subcmd1 --help
Help message for subcmd1 ...
% script --verbose subcmd2 --baz --bar val
Running subcommand subcmd2 ...
% script subcmd3
Unknown subcommand 'subcmd3'
GetOptions failed!
DESCRIPTION
This module extends Getopt::Long with subcommands and tab completion
ability.
How parsing works: First we call "Getopt::Long::GetOptions" with the
top-level options, passing through unknown options if we have
subcommands. Then, subcommand name is taken from the first argument. If
subcommand has options, the process is repeated. So
"Getopt::Long::GetOptions" is called once at every level.
Completion: Scripts using this module can complete themselves. Just put
your script somewhere in your "PATH" and run something like this in your
bash shell: "complete -C script-name script-name". See also shcompgen to
manage completion scripts for multiple applications easily.
How completion works: Environment variable "COMP_LINE" or "COMMAND_LINE"
(for tcsh) is first checked. If it exists, we are in completion mode and
@ARGV is parsed/formed from it. We then perform parsing to get
subcommand names. Finally we hand it off to Complete::Getopt::Long.
CAVEATS
Common options take precedence over subcommand options
Common options (e.g. "--help") are parsed and removed from the
command-line first. This is done for convenience so you can do something
like "cmd subc --help" or "cmd --help subc" to get help. The consequence
is you cannot have a subcommand option with the same name as common
option.
Similarly, options for a subcommand takes precedence over its
sub-subcommand, and so on.
FUNCTIONS
GetOptions(%cmdspec) => hash
Exported by default.
Process options and/or subcommand names specified in %cmdspec, and
remove them from @ARGV (thus modifying it). Will warn to STDERR on
errors. Actual command-line options parsing will be done using
Getopt::Long.
Return hash structure, with these keys: "success" (bool, false if
parsing options failed e.g. unknown option/subcommand, illegal option
value, etc), "subcommand" (array of str, subcommand name, if there is
any; nested subcommands will be listed in order, e.g. "["sub1",
"subsub1"]").
Arguments:
* summary => str
Used by autohelp (not yet implemented).
* options => hash
A hash of option names and its specification. The specification is
the same as what you would feed to Getopt::Long's "GetOptions".
* subcommands => hash
A hash of subcommand name and its specification. The specification
looks like "GetOptions" argument, with keys like "summary",
"options", "subcommands" (for nested subcommands).
* default_subcommand => str
Default subcommand to use if no subcommand name is set. Subcommand
can be set using the first argument, or your option handler can also
set the subcommand using:
$_[2]{subcommand_name} = 'something';
* configure => arrayref
Custom Getopt::Long configuration. The default is:
['no_ignore_case', 'no_getopt_compat', 'gnu_compat', 'bundling']
Note that even though you use custom configuration here, the tab
completion (performed by Complete::Getopt::Long only supports
"no_ignore_case", "gnu_compat", and "no_getopt_compat".
Differences with "Getopt::Long"'s "GetOptions":
* Accept a command/subcommand specification (%cmdspec) instead of just
options specification (%ospec) like in "Getopt::Long").
* This module's function returns hash instead of bool.
* Coderefs in "options" will receive an extra argument $res which is
the result hash (being built). So the arguments that the coderefs
get is:
($callback, $value, $res)
FAQ
How to avoid modifying @ARGV? How to process from another array, like Getopt::Long's GetOptionsFromArray?
Instead of adding another function, you can use "local".
{
local @ARGV = ['--some', 'value'];
GetOptions(...);
}
# the original @ARGV is restored
HOMEPAGE
Please visit the project's homepage at
<
https://metacpan.org/release/Getopt-Long-Subcommand>.
SOURCE
Source repository is at
<
https://github.com/perlancar/perl-Getopt-Long-Subcommand>.
BUGS
Please report any bugs or feature requests on the bugtracker website
<
https://rt.cpan.org/Public/Dist/Display.html?Name=Getopt-Long-Subcomman
d>
When submitting a bug or request, please include a test-file or a patch
to an existing test-file that illustrates the bug or desired feature.
SEE ALSO
Getopt::Long
Getopt::Long::Complete
Perinci::CmdLine - a more full featured command-line application
framework, also with subcommands and completion.
Pod::Weaver::Section::Completion::GetoptLongSubcommand
AUTHOR
perlancar <
[email protected]>
COPYRIGHT AND LICENSE
This software is copyright (c) 2019, 2017, 2016, 2015 by
[email protected].
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.