在 Perl 的 Getopt::Long 2.39 版中,我可以使用

use Getopt::Long qw( :config gnu_getopt );
GetOptions(
   \my %opts,
   "codon-view|c:20",    # Optional value, default 20
   "consensus|C:50",
   ...
)

表示如果我使用 -c,当给出 %opts 但没有明确的值时,默认值将是 20 放在 codon-view 键下的 -c 中。另一方面,未提供 -c--codon-view ,则哈希表中没有值存储在 %opts 中。

在 2.48 中这不再有效,我在 Getopt::Long's documentation 中看不到
$ perl -E'
   use Getopt::Long qw( :config gnu_getopt );
   say $Getopt::Long::VERSION;
   GetOptions(\my %opts, "codon-view|c:20");
   say $opts{"codon-view"} // "[undef]"
' -- -c
2.39
20

$ perl -E'
   use Getopt::Long qw( :config gnu_getopt );
   say $Getopt::Long::VERSION;
   GetOptions(\my %opts, "codon-view|c:20");
   say $opts{"codon-view"} // "[undef]"
' -- -c
2.48
[undef]

我怎样才能实现旧的行为?

帮助!

最佳答案

这是 2.48 中引入的更改。

$ perl -E'
   use Getopt::Long qw( :config gnu_getopt );
   say $Getopt::Long::VERSION;
   GetOptions(\my %opts, "codon-view|c:20");
   say $opts{"codon-view"} // "[undef]"
' -- -c
2.47
20

$ perl -E'
   use Getopt::Long qw( :config gnu_getopt );
   say $Getopt::Long::VERSION;
   GetOptions(\my %opts, "codon-view|c:20");
   say $opts{"codon-view"} // "[undef]"
' -- -c
2.48
[undef]

我不确定,但我认为这是无意的,所以我提交了 bug report
use Getopt::Long qw( :config gnu_getopt );

是简称
use Getopt::Long qw( :config gnu_compat bundling permute no_getopt_compat );

您在使用 gnu_compat 方面投入了多少?
$ perl -E'
   use Getopt::Long qw( :config gnu_getopt );
   say $Getopt::Long::VERSION;
   GetOptions(\my %opts, "codon-view|c:20");
   say $opts{"codon-view"} // "[undef]"
' -- -c
2.48
[undef]

$ perl -E'
   use Getopt::Long qw( :config gnu_compat bundling permute no_getopt_compat );
   say $Getopt::Long::VERSION;
   GetOptions(\my %opts, "codon-view|c:20");
   say $opts{"codon-view"} // "[undef]"
' -- -c
2.48
[undef]

$ perl -E'
   use Getopt::Long qw( :config bundling permute no_getopt_compat );
   say $Getopt::Long::VERSION;
   GetOptions(\my %opts, "codon-view|c:20");
   say $opts{"codon-view"} // "[undef]"
' -- -c
2.48
20



因此,如果您对 --codon-view= 将零分配给 $opts{"codon-view"} 没问题,只需使用
use Getopt::Long qw( :config bundling permute no_getopt_compat );

代替
use Getopt::Long qw( :config gnu_getopt );

关于perl - 在较新的 Getopt::Long 如何设置默认可选值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37579192/

10-13 04:59