modern getopt for command line processing in perl
DESCRIPTION
Getopt modules, such as Getopt::Long, are used for processing command line options. There are over sixty Getopt modules on CPAN, which can be intimidating to select from. This talk highlights some of the Getopt pearls that have been released in the past few years. Presented at YAPC::NA 2011, June 28, Asheville, NC.TRANSCRIPT
Modern Getopt forCommand Line Processing
Nick Patch
YAPC::NA
28 June 2011
"Getting command line options anddealing with them is a colossal pain,and every module that does it sucks
and offends someone."
— Ricardo Signes (rjbs)
Getopt::Abridged Getopt::ArgvFile Getopt::AsDocumented Getopt::Attribute Getopt::AutoConf Getopt::Awesome Getopt::Base Getopt::CallingName Getopt::Casual Getopt::Chain Getopt::Clade
Getopt::Compact Getopt::Compact::WithCmd Getopt::Complete Getopt::constant Getopt::Declare Getopt::Easy Getopt::Euclid Getopt::EvaP Getopt::ExPar Getopt::Fancy Getopt::FileConfig
Getopt::Flex Getopt::Function Getopt::GetArgs Getopt::GUI::Long Getopt::Helpful Getopt::Inherited Getopt::Janus Getopt::Lazy
Getopt::LL Getopt::Long Getopt::Long::Descriptive Getopt::Long::DescriptivePod Getopt::Long::GUI Getopt::LongUsage Getopt::Lucid Getopt::Mixed Getopt::Mixed::Help Getopt::Modular
Getopt::OO Getopt::Param Getopt::Param::Tiny Getopt::Plus Getopt::Regex Getopt::Simple Getopt::Std::Strict
Getopt::Std::WithCheck Getopt::Tabular Getopt::Tiny Getopt::Tree Getopt::Usaginator Getopt::Whatever Getopt::WonderBra Getopt::XML
Getopt::Yagow Getopt_Auto CBSSports::Getopt CGI::Getopt MooseX::Getopt MooseX::Getopt::Defanged MouseX::Getopt Tk::Getopt
that's 63 Getopt modules
Getopt::Easy or Getopt::Simple?
Getopt::Tiny or Getopt::Compact?
maybe Getopt::Awesome?
Getopt::WonderBra?!
Getopt::WonderBra?!
"Lift and Separate Command Line Options"
dependents
454 Getopt::Long 64 MooseX::Getopt 28 Getopt::Long::Descriptive 18 Getopt::ArgvFile 11 Getopt::Std::Strict 10 Getopt::Lucid 7 Getopt::Euclid 5 Getopt::Attribute 5 Getopt::Mixed 5 Getopt::Usaginator
minus same authors
446 Getopt::Long 62 MooseX::Getopt 19 Getopt::Long::Descriptive 17 Getopt::ArgvFile 7 Getopt::Euclid 7 Getopt::Lucid 5 Getopt::Mixed
plus first release date
446 Getopt::Long 1995 62 MooseX::Getopt 2007 19 Getopt::Long::Descriptive 2005 17 Getopt::ArgvFile 1999 7 Getopt::Euclid 2005 7 Getopt::Lucid 2005 5 Getopt::Mixed 1996
Getopt::Lucid
$ munge --in refuse.log --out allure.json
$ munge --in refuse.log --out allure.json
my $opt = Getopt::Lucid->getopt({ Param('in'), Param('out'),});
$ munge --in refuse.log --out allure.json
my $opt = Getopt::Lucid->getopt({ Param('in')->required, Param('out')->required,});
$ munge --in refuse.log --out allure.json
my $opt = Getopt::Lucid->getopt({ Param('in')->required, Param('out')->required,});
open my $in_fh, '<', $opt->get_in;open my $out_fh, '>', $opt->get_out;
$ frobnicate --calibrate$ frobnicate -c
$ frobnicate --calibrate$ frobnicate -c
my $opt = Getopt::Lucid->getopt({ Switch('calibrate|c'),});
$ frobnicate --calibrate$ frobnicate -c
my $opt = Getopt::Lucid->getopt({ Switch('calibrate|c'),});
print "Calibrating the frobnicator!\n" if $opt->get_calibrate;
$ frobnicate --calibrate$ frobnicate -c
use 5.010;
my $opt = Getopt::Lucid->getopt({ Switch('calibrate|c'),});
say 'Calibrating the frobnicator!' if $opt->get_calibrate;
$ frobnicate --calibrate$ frobnicate -c
use 5.010;
my $opt = Getopt::Lucid->getopt({ Switch('calibrate|c'),});
say 'Calibrating the frobnicator!' if $opt->get_calibrate;
$opt->set_calibrate(0);
$ perlping -v -s 512 4.2.2.2
$ perlping -v -s 512 4.2.2.2
my $opt = Getopt::Lucid->getopt({ Param('size|s'), Param('ttl|t'), Switch('verbose|v'),});
$ perlping -v -s 512 4.2.2.2
my $opt = Getopt::Lucid->getopt({ Param('size|s')->default(64), Param('ttl|t')->default(50), Switch('verbose|v'),});
$ perlping -v -s 512 4.2.2.2
my $opt = Getopt::Lucid->getopt({ Param('size|s')->default(64), Param('ttl|t')->default(50), Switch('verbose|v'),});
my $destination = shift @ARGV;
MooseX::Getopt
MooseX::Getoptor
MouseX::Getopt
$ munge --in refuse.log --out allure.json
$ munge --in refuse.log --out allure.json
package File::Munge;use Moose;with 'MooseX::Getopt';
$ munge --in refuse.log --out allure.json
package File::Munge;use Moose;with 'MooseX::Getopt';
has in => (is => 'rw', isa => 'Str');has out => (is => 'rw', isa => 'Str');
$ munge --in refuse.log --out allure.json
package File::Munge;use Moose;with 'MooseX::Getopt';
has in => (is => 'rw', isa => 'Str', required => 1);has out => (is => 'rw', isa => 'Str', required => 1);
$ munge --in refuse.log --out allure.json
package File::Munge;use Moose;with 'MooseX::Getopt';
has in => (is => 'rw', isa => 'Str', required => 1);has out => (is => 'rw', isa => 'Str', required => 1);
sub munge { my $self = shift; open my $in_fh, '<', $self->in; open my $out_fh, '>', $self->out;}
#!/usr/bin/perluse File::Munge;
my $munger = File::Munge->new_with_options;
$munger->munge;
$ frobnicate --calibrate$ frobnicate -c
$ frobnicate --calibrate$ frobnicate -c
has calibrate => ( is => 'rw', isa => 'Bool', traits => ['Getopt'], cmd_aliases => 'c',);
$ frobnicate --calibrate$ frobnicate -c
has calibrate => ( is => 'rw', isa => 'Bool', traits => ['Getopt'], cmd_aliases => 'c',);
sub frob { my $self = shift; say 'Calibrating the frobnicator!' if $self->calibrate; $self->calibrate(0);}
$ perlping -v -s 512 4.2.2.2
$ perlping -v -s 512 4.2.2.2
has size => (is => 'rw', isa => 'Int');has ttl => (is => 'rw', isa => 'Int');has verbose => (is => 'rw', isa => 'Bool');
$ perlping -v -s 512 4.2.2.2
has size => (is => 'rw', isa => 'Int', default => 64);has ttl => (is => 'rw', isa => 'Int', default => 50);has verbose => (is => 'rw', isa => 'Bool');
$ perlping -v -s 512 4.2.2.2
has size => (is => 'rw', isa => 'Int', default => 64);has ttl => (is => 'rw', isa => 'Int', default => 50);has verbose => (is => 'rw', isa => 'Bool');
has _destination => ( is => 'rw', isa => 'Str', default => sub { my $self = shift; return shift @{ $self->extra_argv }; });
$ perlping -v -s 512 4.2.2.2
use 5.014;
has size => (is => 'rw', isa => 'Int', default => 64);has ttl => (is => 'rw', isa => 'Int', default => 50);has verbose => (is => 'rw', isa => 'Bool');
has _destination => ( is => 'rw', isa => 'Str', default => sub { my $self = shift; return shift $self->extra_argv; });
my suggestions
my suggestions
Getopt::Lucid or Getopt::Long::Descriptive
for one-off scripts
my suggestions
Getopt::Lucid or Getopt::Long::Descriptive
for one-off scripts
MooseX::Getopt or MouseX::Getoptfor OO projects
my suggestions
Getopt::Lucid or Getopt::Long::Descriptive
for one-off scripts
MooseX::Getopt or MouseX::Getoptfor OO projects
App::Cmd, MooseX::App::Cmdor MouseX::App::Cmd
for command-driven scripts
questions?
slides at:nickpatch.net