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:
Getopt::Long uses $^W to decide if the warnings should be reported ($dups is the built-up string of warnings, which is correctly set):perl -M'Getopt::Long -e 'use warnings; my ($x,$y); GetOptions ("v" => +\$x, "V" => \$y);'
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 ...
In reply to Re^4: Getopt::Long case matching last wins
by karlberry
in thread Getopt::Long case matching last wins
by karlberry
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |