parv has asked for the wisdom of the Perl Monks concerning the following question:

I am having problems w/ GetOption() not dying when an option is missing a value and use '--' as end-of-options marker. Below is how i tried to invoke it...
screw.perl --debug --

...and screw.perl...

#!/usr/local/bin/perl -w use strict; use Getopt::Long; my %opt = ( 'debug' => 'g1' ); GetOptions( 'debug=s' => \$opt{'debug'} ) || die ("$!\n"); while ( my ($k , $v) = each %opt ) { printf "%s = %s\n" , $k, $v; }

I was expecting the program to die instead of seeing...

  debug = --

...'--' is not swallowed (which has been the intention all along), however, when usage is one of the following...

screw.perl -debug= -- screw.perl --debug= --

Mind you above is only the minimal text to show my problem. I had tried various combinations of configure options (for the module) to no avail. And yes, writing a '=' instead of just ' ' is not preferred.

I am writting a wrapper program which has often used options for the wrapped program in a hash; other options are passed as is. Specifying (on command line) any option to pass as is before the ones set in GetOptions() is hard to work w/.

All the problems want me to write my own damn option parsing module. How do people cope when writing a a Perl wrapper which accepts known & unkwon options for the wrapped program?

Replies are listed 'Best First'.
Re: Wrapper headache - Getopt::Long screw up w/ '--' and missing opt value
by sauoq (Abbot) on Feb 09, 2003 at 23:02 UTC

    I really don't use Getopt::Long very often, but the docs seemed pretty clear to me...

    = type [ desttype ] The option requires an argument of the given type. Supported types are: s String. An arbitrary sequence of characters. It is valid for the argument to start with "-" or "--".

    If you want your debug option to take an optional argument, you can specify that with a colon instead of an equals; i.e. 'debug:s' rather than 'debug=s'.

    How do people cope when writing a a Perl wrapper which accepts known & unkwon options for the wrapped program?

    Have you looked at how to use Getopt::Long::Configure() to configure Getopt::Long's behavior? It seems that you can use Getopt::Long::Configure('pass_through') to tell Getopt::Long to leave unknown options in @ARGV. You might want to use it with Getopt::Long::Configure('require_order') or Getopt::Long::Configure('permute') as well.

    -sauoq
    "My two cents aren't worth a dime.";
    

      Do'h! I missed the part that says that a string can start w/ '--'. Mea culpa.

      I am aware of use of [:=] to make the option take a an optional argument or not. As presented in the code, i used '=' to require a value for the specified option.

      I also noted, though very indirectly, in OP that "pass_through" makes the process interesting when i wrote "other options are passed as is". My frustation resulted after trying various configuration options.

      All in all, thanks for the clue. I will try other things.

Re: Wrapper headache - Getopt::Long screw up w/ '--' and missing opt value
by waswas-fng (Curate) on Feb 10, 2003 at 05:11 UTC
    All the problems want me to write my own damn option parsing module. How do people cope when writing a a Perl wrapper which accepts known & unkwon options for the wrapped program?

    If they are unknown options what are you trying to do with them except pass them on to the next app? if so just pass ARGV directly. If you are trying to parse the option flags then that kinda implys the options are known. Shrug.

    -Waswas
      Some options are known, others are not; unknowns ones are passed as they are. Please re-read my both of the posts.