Modern Getopt for Command Line Processing in Perl
-
Upload
nick-patch -
Category
Technology
-
view
1.954 -
download
0
description
Transcript of Modern Getopt for Command Line Processing in Perl
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