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

I am having problem getting Getopt::Declare (1.11) working. I have created the following code snippet to try and test a base case. I get no warnings or errors when I run my code with the '-k foo' option, but $args->{'-k'} never seems to be set. What am I doing wrong?
my $args = new Getopt::Declare <<'EOPARAM'; -k <value> EOPARAM if ( $args->{'-k'} ) { print "Using value: ", $args->{'-k'}{'<value>'}; }

Replies are listed 'Best First'.
Re: Getopt::Declare not working
by shmem (Chancellor) on Jul 06, 2006 at 06:31 UTC
    Your declaration is incomplete. Insert a tab after <value>:
    my $args = new Getopt::Declare <<'EOPARAM'; -k <value> print kudos EOPARAM if ( $args->{'-k'} ) { print "Using value: ", $args->{'-k'}."\n"; }
    From the manual (emphasis mine):
    The parameter definition consists of a leading flag or parameter variable, followed by any number of parameter variables or punctuators, optionally separated by spaces. The parameter definition is terminated by the first tab that is encountered after the start of the parameter definition. At least one trailing tab must be present.

    There should be a description of the switch, and at least one tab after each parameter declaration. Note that a newline is needed if declaring multiple parameters. The following

    #!/usr/bin/perl use Getopt::Declare; my $args = new Getopt::Declare <<'EOPARAM'; -v <value> -k <value> EOPARAM for ( qw(-v -k) ) { print "Using value: ", $args->{$_}."\n" if $args->{$_}; }
    when invoked with perl 559479.pl -k bar -v foo only prints Using value: foo.

    --shmem

    _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                  /\_¯/(q    /
    ----------------------------  \__(m.====·.(_("always off the crowd"))."·
    ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}
      Excellent, all I was missing was the tab. My problem now is; I have added an exclude stmt to a section, and I want Getopt::Declare to die if the exclude fails, for example
      my $args = new Getopt::Declare <<'EOPARAM'; [strict] -e <env> Collect data for systems in one env (can be used w +ith -t) -t <type> Collect data for one type of system (can be used +with -e) -s <systemname> Collect data for one system [excludes: -e -t] -- EOPARAM
      the -s option cannot be used with either -e or -t, and I want the command line parser to cause the program to die gracefully when this happens. Right now, the parser spits out an error ("you cant use -s with -(e|t)") and then program execution continues.
        Hum? As for this code
        #!/usr/bin/perl use Getopt::Declare; my $args = new Getopt::Declare <<'EOPARAM'; [strict] -e <env> Collect data for systems in one env (can be us +ed with -t) -t <type> Collect data for one type of system (can be us +ed with -e) -s <systemname> Collect data for one system [excludes: -e -t] -- EOPARAM for ( qw(-e -s -t) ) { print "Using value: ", $args->{$_}." for switch $_\n" if $args->{$_}; } __END__ perl 559575.pl -s quux -e foo -t bar

        it just dies after spitting out it's laments:

        Error: parameter '-e' not allowed with parameter '-s' Error: parameter '-t' not allowed with parameter '-s' Error: unrecognizable argument ('foo') Error: unrecognizable argument ('bar') (try '559575.pl -help' for more information)
        and the for loop is not entered. *shrug* Are you masking signals/__DIE__ ?

        --shmem

        _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                      /\_¯/(q    /
        ----------------------------  \__(m.====·.(_("always off the crowd"))."·
        ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}
Re: Getopt::Declare not working
by davido (Cardinal) on Jul 06, 2006 at 04:46 UTC

    I can't explain why it's not catching the -k parameter. I tried it with similar result. There is one interesting thing I discovered when I dumped the object through Data::Dumper though: The paramaters '-k' and 'foo' are enumerated in @{$args->{_internal}{unused}}. So we know they were in @ARGV to begin with, and that Getopt::Declare found them, but the module doesn't seem to be using them.

    I like what Damian Conway says in the docs under the BUGS section: "If nothing else, it shouldn't take 1500 lines to explain a package that was designed for intuitive ease of use!"


    Dave