How many times have you seen (or written) a perl script that was well 
documented with POD, but also had a usage() function which
duplicated  some of the information contained in the POD? Every time you
add an  option, you need to remember to document it in both. What if you
want to display a detailed description of the options to the user? Things 
only get messier. Pod::Usage
Pod::Usage
allows you to make portions of your POD available to the user as help.
Pod::Usage provides the pod2usage subroutine, which accepts
a number of options. The most commonly needed are -message (the
initial line of the usage message e.g; brief description of the program) and
-verbose (control how detailed the help output is).
-exitval can be used to control the exit value returned to the
shell, most commonly to exit with a non-zero status if invalid arguments were
provided.
Using Pod::Usage to handle our usage information for us, we've managed to completely prevent any documentation duplication (say that three times fast) in our sample code. Let's take a look at in action:
santa@northpole:~/ $ ./mod12.pl 
 --filename required
Usage:
     my_script.pl [-v] -f <filename>
Options:
    -f or --file <filename> (required)
            The filename to be used as input. Required.
    -h or --help
            Print a brief help message and exits.
    -v or --verbose
            Print verbose output as the script runs. Can be used more than
            once to increase the verbosity.
Oops, we didn't supply a required parameter. pod2usage helpfully prints the script's usage information along with the error. Of course, had we checked the syntax the first time --help would have given us briefer but clear directions:
santa@northpole:~/ $ ./mod12.pl --help
Usage:
     my_script.pl [-v] -f <filename>
If we'd really wanted the verbose help we could have gotten that too:
santa@northpole:~/ $ ./mod12.pl --help --verbose
Usage:
     my_script.pl [-v] -f <filename>
Options:
    -f or --file <filename> (required)
            The filename to be used as input. Required.
    -h or --help
            Print a brief help message and exits.
    -v or --verbose
            Print verbose output as the script runs. Can be used more than
            once to increase the verbosity.
Using the verbose option more than once displays the full man page (probably better provided with a --man option):
santa@workshop:~ $ ./mod12.pl --help -v -v
MOD12(1)              User Contributed Perl Documentation             MOD12(1)
NAME
 my_script.pl
SYNOPSIS
 my_script.pl [-v] -f <filename>
OPTIONS
 -f or --file <filename> (required)
     The filename to be used as input.  Required.
 -h or --help
     Print a brief help message and exits.
 -v or --verbose
     Print verbose output as the script runs.  Can be used more than
     once to increase the verbosity.
BUGS
        None known at this time
 
perl v5.8.6                       2006-12-12                          MOD12(1)
Our POD can now be used to display help for our script based on the command line options provided, and all the documentation is now in one place. We do still have to keep the documentation in sync with the call to GetOptions, however. Is there a way we can prevent even that duplication? Yes.
1 #!/usr/bin/perl 2 3 =head1 NAME 4 5 my_script.pl 6 7 =head1 SYNOPSIS 8 9 my_script.pl [-v] -f10 11 =head1 OPTIONS 12 13 =over 8 14 15 =item B<-f> or B<--file> (required) 16 17 The filename to be used as input. Required. 18 19 =item B<-h> or B<--help> 20 21 Print a brief help message and exits. 22 23 =item B<-v> or B<--verbose> 24 25 Print verbose output as the script runs. 26 Can be used more than once to increase the verbosity. 27 28 =back 29 30 =head1 BUGS 31 32 None known at this time 33 34 =cut 35 36 use Pod::Usage qw/ pod2usage /; 37 use Getopt::Long qw/ GetOptions /; 38 39 GetOptions( 'file=s' => \(my $file), 40 'verbose+' => \(my $verbose), 41 'help' => \(my $help), 42 ); 43 44 pod2usage(-verbose => $verbose) if $help; 45 pod2usage( -message => '--filename required', 46 -exitval => 1, 47 -verbose => $verbose, 48 ) unless defined $file; 49 50 51 52 print "I got the following options: 53 file: $file 54 verbose: $verbose 55 " if $verbose;