Modern Getopt for Command Line Processing in Perl

48
Modern Getopt for Command Line Processing Nick Patch YAPC::NA 28 June 2011

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