in reply to Getopt::Long case matching last wins

Workarounds are possible, such as the commented-out :config no_ignore_case

no_ignore_case is not what I would consider a work-around. It's a feature intentionally provided by the module author for users who want case-sensitivity throughout. It seems to be precisely the solution to the problem you have encountered - why not use it?


🦛

Replies are listed 'Best First'.
Re^2: Getopt::Long case matching last wins
by karlberry (Sexton) on May 29, 2023 at 21:08 UTC
    I'm asking why getopt does not complain about the case ambiguity (of v/V), as it is documented to do, instead of arbitrarily picking the last one. Or, perhaps I'm asking if it's a bug (either documentation or code) or if I'm missing something.

      Interestingly it does flag the aliases for me:

      $ perl -MGetopt::Long -we 'GetOptions ("a|x" => \$x, "A|y" => \$y);' Name "main::y" used only once: possible typo at -e line 1. Name "main::x" used only once: possible typo at -e line 1. Duplicate specification "A|y" for option "a" $ perl -MGetopt::Long -we 'GetOptions ("a|x" => \$x, "b|X" => \$y);' Name "main::y" used only once: possible typo at -e line 1. Name "main::x" used only once: possible typo at -e line 1. Duplicate specification "b|X" for option "x"

      So if either the primary or the alias is non-unique in a case-insensitive way, the warning is shown. I'm using version 2.52 of Getopt::Long.


      🦛

        I'm also using Getopt::Long 2.52 (and perl 5.36.1). I also get the warning with your invocation. But my original code does not get a warning.

        After adding debugging lines to Getopt/Long.pm, I see it's because use warnings does not set $^W (in contrast to the -w option that you used, which does). As in:

        perl -M'Getopt::Long -e 'use warnings; my ($x,$y); GetOptions ("v" => +\$x, "V" => \$y);'
        Getopt::Long uses $^W to decide if the warnings should be reported ($dups is the built-up string of warnings, which is correctly set):
        if ( $dups && $^W ) { foreach ( split(/\n+/, $dups) ) { warn($_."\n");

        Judging from https://perldoc.perl.org/warnings#Reporting-Warnings-from-a-Module, I guess Getopt::Long should not (solely?) be looking at $^W nowadays?

        Grepping the 5.36.1/ directory, I see some 30 other cases of "if.*\$\^W". So the end result is apparently that a few warnings in core modules are missed when using "use warnings", but shown when using -w ...