Perl Getopt::长相关问题 - 互斥的命令行参数
我的 perl 脚本中有以下代码:
my $directory; my @files; my $help; my $man; my $verbose; undef $directory; undef @files; undef $help; undef $man; undef $verbose; GetOptions( "dir=s" => \$directory, # optional variable with default value (false) "files=s" => \@files, # optional variable that allows comma-separated # list of file names as well as multiple # occurrenceces of this option. "help|?" => \$help, # optional variable with default value (false) "man" => \$man, # optional variable with default value (false) "verbose" => \$verbose # optional variable with default value (false) ); if (@files) { @files = split(/,/,join(',', @files)); }
What is the best way to processmutual Exclusive Command Line Arguments? 在我的脚本中,我只希望用户仅输入“--dir”或“--files”命令行参数,但不能同时输入两者。 是否有配置 Getopt 来执行此操作?
谢谢。
I have the following code in my perl script:
my $directory; my @files; my $help; my $man; my $verbose; undef $directory; undef @files; undef $help; undef $man; undef $verbose; GetOptions( "dir=s" => \$directory, # optional variable with default value (false) "files=s" => \@files, # optional variable that allows comma-separated # list of file names as well as multiple # occurrenceces of this option. "help|?" => \$help, # optional variable with default value (false) "man" => \$man, # optional variable with default value (false) "verbose" => \$verbose # optional variable with default value (false) ); if (@files) { @files = split(/,/,join(',', @files)); }
What is the best way to handle mutually exclusive command line arguments? In my script I only want the user to enter only the "--dir" or "--files" command line argument but not both. Is there anyway to configure Getopt to do this?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我认为 Getopt::Long 中没有办法做到这一点,但是您自己实现它很容易(我假设有一个使用函数返回一个字符串,告诉用户如何调用该程序):
I don't think there is a way in Getopt::Long to do that, but it is easy enough to implement on your own (I am assuming there is a usage function that returns a string that tells the user how to call the program):
为什么不只是这个:
Why not just this:
您可以简单地检查两个变量中是否存在值。
或者,如果您想简单地忽略第一个 --dir 或 --files 之后指定的任何选项,您可以将两者都指向一个函数。
You can simply check for the existence of values in both variables.
Or, if you would like to simply ignore any options specified after the first --dir or --files, you can point both at a function.
您可以使用 Getopt::Long::Descriptive 来完成此操作。 它与 Getopt::Long 有点不同,但如果您要打印使用摘要,它会为您完成所有这些操作,从而有助于减少重复。
在这里,我添加了一个名为
source
的隐藏选项,因此$opt->source
将包含值dir
或files
取决于给定的选项,它将为您强制执行one_of
约束。 给定的值将位于$opt->dir
或$opt->files
中,以给出的为准。脚本其余部分的主要区别在于,所有选项都作为
$opt
变量的方法包含,而不是像Getopt::Long
那样每个选项都有自己的变量代码>.You can do this with
Getopt::Long::Descriptive
. It's a bit different fromGetopt::Long
, but if you're printing a usage summary, it helps to reduce duplication by doing all that for you.Here, I've added a hidden option called
source
, so$opt->source
which will contain the valuedir
orfiles
depending on which option was given, and it will enforce theone_of
constraint for you. The values given will be in$opt->dir
or$opt->files
, whichever one was given.The main difference for the rest of your script is that all the options are contained as methods of the
$opt
variable, rather than each one having its own variable like withGetopt::Long
.