Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Modern Getopt for Command Line Processing in Perl

Modern Getopt for Command Line Processing in Perl

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:
◦  2011-06-28: YAPC::NA 2011, Asheville, NC

Nova Patch

June 28, 2011
Tweet

More Decks by Nova Patch

Other Decks in Programming

Transcript

  1. "Getting command line options and dealing with them is a

    colossal pain, and every module that does it sucks and offends someone." — Ricardo Signes (rjbs)
  2. 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
  3. 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
  4. 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
  5. 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
  6. $ munge --in refuse.log --out allure.json my $opt = Getopt::Lucid->getopt({

    Param('in')->required, Param('out')->required, });
  7. $ 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;
  8. $ frobnicate --calibrate $ frobnicate -c my $opt = Getopt::Lucid->getopt({

    Switch('calibrate|c'), }); print "Calibrating the frobnicator!\n" if $opt->get_calibrate;
  9. $ frobnicate --calibrate $ frobnicate -c use 5.010; my $opt

    = Getopt::Lucid->getopt({ Switch('calibrate|c'), }); say 'Calibrating the frobnicator!' if $opt->get_calibrate;
  10. $ 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);
  11. $ perlping -v -s 512 4.2.2.2 my $opt = Getopt::Lucid->getopt({

    Param('size|s'), Param('ttl|t'), Switch('verbose|v'), });
  12. $ 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'), });
  13. $ 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;
  14. $ 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');
  15. $ 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);
  16. $ 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; }
  17. $ frobnicate --calibrate $ frobnicate -c has calibrate => (

    is => 'rw', isa => 'Bool', traits => ['Getopt'], cmd_aliases => 'c', );
  18. $ 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); }
  19. $ 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');
  20. $ 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');
  21. $ 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 }; } );
  22. $ 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; } );
  23. my suggestions Getopt::Lucid or Getopt::Long::Descriptive for one-off scripts MooseX::Getopt or

    MouseX::Getopt for OO projects App::Cmd, MooseX::App::Cmd or MouseX::App::Cmd for command-driven scripts