Getopt::Chain will help you make your command-line scripts work like this:
./script --opt --opt=<value> cmd --opt ...
./script cmd ...
NOTE: Any option specification covered by Getopt::Long is fair game.
Here is some example usage:
#!/usr/bin/perl -w
use strict;
use Getopt::Chain;
# A partial, pseudo-reimplementation of git(1):
Getopt::Chain->process(
options => [qw/ version bare git-dir=s /]
run => sub {
my $context = shift;
my @arguments = @_; # Remaining, unparsed arguments
# ... do stuff before any subcommand ...
}
commands => {
init => {
options => [qw/ quiet|q --template=s /]
run => sub {
my $context = shift;
my @arguments = @_; # Again, remaining unparsed arguments
# ... do init stuff ...
}
}
commit => {
options => [qw/ all|a message|m=s /]
run => sub {
my $context = shift;
# ... do commit stuff ..
}
}
add => ...
help => ...
...
}
)
# The above will allow the following (example) usage:
#
# ./script --version
# ./script --git-dir path/to/repository init
# ./script --git-dir path/to/repository commit -a --message '...'
# ./script commit -m '~'
The source repository is on GitHub: http://github.com/robertkrimen/getopt-chain/tree/master
you might be interested in looking at and/or stealing from App::Cmd
Re:App::Cmd
grink on 2008-08-18T03:12:20
Yeahp, I was/am aware of (MooseX::)App::Cmd, they feature prominently in the SEE ALSO