Scripts

Standard prologue for option parsing:

use Getopt::Long;

my $platform = 'Unix';
$platform = 'Windows' if ($^O =~ /^(?:MSWin32|os2|dos)$/);

my %infoForOption = (
  cookiefile => {
    optfmt => '=s',
  },
  cookiefiletype => {
    optfmt => '=s',
    default => 'Mozilla',
    supportedValues => [
      'Mozilla',
      'Microsoft',
    ],
  },
  authfile => {
    optfmt => '=s',
  },
  savecookies => {
  },
  urlfile => {
    optfmt => '=s',
    fMandatory => 1,
  },
  'help|h' => {
    optName => 'help',
  },
  man => {
  },
  debug => {
  },
  verbose => {
    optfmt => '+',
  },
};


# Build up list of options (to pass to GetOptions) and list of mandatory
# options so it can be checked afterwards

my @supportedOptions;
my @mandatoryOptions;

my %options = ();

foreach my $opt ( keys %infoForOption )
{
  my $optInfo = $infoForOption{$opt};
  my $optDesc = $opt;
  $optDesc .= $optInfo->{optfmt}
    if exists $optInfo->{optfmt} && $optInfo->{optfmt};

  push @supportedOptions, $optDesc;
  if ( exists $optInfo->{fMandatory} && $optInfo->{fMandatory} )
  {
    my $optName = $opt;
    if ( exists $optInfo->{optName} && $optInfo->{optName} )
    {
      $optName = $optInfo->{optName};
    }
    push @mandatoryOptions, $optName;
  }
  if ( exists $optInfo->{default} && defined $optInfo->{default} )
  {
    $options{$opt} = $optInfo->{default};
  }
}  # Loop over all options


GetOptions(\%options, @supportedOptions);

if ( exists $options{help} )
{
  pod2usage(-verbose => 1, -exitval => 0);
}

if ( exists $options{man} )
{
  pod2usage(-verbose => 2, -exitval => 0);


my @missingOpts = ();
foreach my $opt ( @mandatoryOptions )
{
  unless (   exists $options{$opt}
          && defined $options{$opt} && $options{$opt} ne '' )
  {
    push @missingOpts, $opt;
  }
}

@missingOpts = sort @missingOpts;

if ( scalar @missingOpts )
{
  print "Missing mandatory options: -", join ' -', @missingOpts;
  print "\n";
  exit 1;
}

# ... loop over options with supportedValues, and validate them
# grep $options{argName}, @{$infoForOption{argName}{supportedValues}}