Modern Getopt for Command Line Processing in Perl

Post on 15-May-2015

1955 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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

top related