summaryrefslogtreecommitdiff
path: root/posts/2009-06-22-modules-i-like-getopt-long-and-moosex-getopt.org
diff options
context:
space:
mode:
Diffstat (limited to 'posts/2009-06-22-modules-i-like-getopt-long-and-moosex-getopt.org')
-rw-r--r--posts/2009-06-22-modules-i-like-getopt-long-and-moosex-getopt.org137
1 files changed, 137 insertions, 0 deletions
diff --git a/posts/2009-06-22-modules-i-like-getopt-long-and-moosex-getopt.org b/posts/2009-06-22-modules-i-like-getopt-long-and-moosex-getopt.org
new file mode 100644
index 0000000..02b0903
--- /dev/null
+++ b/posts/2009-06-22-modules-i-like-getopt-long-and-moosex-getopt.org
@@ -0,0 +1,137 @@
+** Getopt::Long
+
+[[http://search.cpan.org/perldoc?Getopt::Long][Getopt::long]] is a
+useful module to parse command line arguements.
+
+A basic usage is something like this:
+
+#+BEGIN_SRC perl
+ #!/usr/bin/perl -w
+ use strict;
+ use YAML::Syck;
+ use Getopt::Long;
+
+ GetOptions('config=s' => \my $cfg_file,);
+
+ my $config = LoadFile $cfg_file
+#+END_SRC
+
+In *GetOptions*, we require a value for config with *config=s*. If we
+wante an integer, we replace 's' with 'i', and for a floating point,
+with 'f'.
+
+Call your script :
+
+#+BEGIN_EXAMPLE
+ % script.pl --config=file.yml #this one works
+ % script.pl --config file.yml #this one too!
+ % script.pl -c file.yml #and this one too
+#+END_EXAMPLE
+
+The three syntaxes are understood.
+
+A good practices is to combine this module with
+[[http://search.cpan.org/perldoc?Pod::Usage][Pod::Usage]]. Let's do some
+modifications on the example:
+
+#+BEGIN_SRC perl
+ #!/usr/bin/perl -w
+ use strict;
+ use YAML::Syck;
+ use Getopt::Long;
+ use Pod::Usage;
+
+ GetOptions('config=s' => \my $cfg_file,) or pod2usage(2);
+ pod2usage(2) unless @ARGV > 0;
+
+ my $config = LoadFile $cfg_file
+
+ __END__
+ =head1 NAME
+
+ uberscript
+
+ =head1 SYNOPSIS
+
+ uberscript [options]
+
+ Options:
+
+ --config config file
+
+ =head1 Options
+
+ =over 4
+
+ =item B<config>
+
+ Path to the config file
+#+END_SRC
+
+then
+
+#+BEGIN_EXAMPLE
+ % perl uberscript
+
+ Usage:
+ uberscript [options]
+
+ Options:
+ --config config file
+#+END_EXAMPLE
+
+From now if we call our script without argument, the POD will be printed
+on STDIN.
+
+** MooseX::Getopt
+
+[[http://search.cpan.org/perldoc?MooseX::Getopt][MooseX::Getopt]] is a
+Role that add a =new_with_options= to your object. We create a basic
+Object :
+
+#+BEGIN_SRC perl
+ package OurShinyObject;
+
+ use Moose;
+ with qw/MooseX::Getopt/;
+
+ has 'config' => (isa => 'Str', is => 'ro', required => 1);
+ has 'context' => (
+ isa => 'HashRef',
+ is => 'rw',
+ lazy => 1,
+ traits => ['NoGetopt'],
+ default => sub { LoadFile shift->config }
+ );
+
+ ...
+#+END_SRC
+
+create a script to call this object
+
+#+BEGIN_SRC perl
+ #!/usr/bin/perl -w
+ use strict;
+ use OurShinyObject;
+
+ my $obj = OurShinyObject->new_from_options();
+#+END_SRC
+
+#+BEGIN_SRC sh
+ % script.pl --config file.yml
+#+END_SRC
+
+The role will set our attribute *context* using the value from the
+argument set on the command line.
+
+The =traits => ['NoGetopt']= indicate that this attributes will be not
+be read from the command line. An alternate way to do this is to prefix
+the attributes with **\_**.
+
+** conclusion (?)
+
+When you write a script, even if you're sure you will never need to have
+more than one argument, or that you never will have to update the code,
+/please/ consider to use of *Getopt::Long* instead of a =shift @ARGV=,
+because we all know that you will at a certain point update this script
+and you will more than one argument :).