我一直无法为此制定搜索短语,所以如果已经提出要求,请向我道歉。 (可能已经。)
我正在编写一个新的Perl实用程序的选项是--sortby选项。我给用户的可用选择是:
现在,我很容易非常在GetOptions调用之后实现它,只需检查是否($ opt_sortby eq“SID”|| $ opt_sortby eq“SID”)。 (实际上,我已经编码了一些更优雅但这是另一个问题。)但是我正在努力推动我的知识,看看我是否可以强制这个选择由GetOptions强制执行,比如
GetOptions('sortby=s' => {"SID" | "TID"});
请注意,我只是使用文档中常用的符号来表示强制性的“其中一种”选择。我并不期望在GetOptions中使用这种确切的语法。
想点什么?
非常感谢。 (Szépenköszönöm,如果G.S.回答: - )
- 雅各布S。
答案 0 :(得分:1)
GetOptions
返回后检查非常简单。
my %valid_sort_by = map { $_ => 1 } qw( SID TID );
GetOptions('sortby=s' => \$opt_sort_by)
or usage();
if (defined($valid_sort_by)) {
$valid_sort_by{$opt_sort_by}
or usage("Invalid value for --sortby\n");
}
它更复杂,但你可以通过回调实现你所要求的。
my %valid_sort_by = map { $_ => 1 } qw( SID TID );
GetOptions(
'sortby=s' => sub {
my ($opt_name, $opt_value) = @_;
$valid_sort_by{$opt_value}
or die("Invalid value for --$opt_name\n");
$opt_sort_by = $opt_value;
},
)
or usage();
后者的优点是它会检测
中的错误command --sortby=bad --sortby=SID
答案 1 :(得分:1)
或者,您可以使用Getopt::Declare。它支持枚举值:
use strict;
use warnings;
use Getopt::Declare;
my $args = Getopt::Declare->new(
join( "\n",
"--sort-by <s:/SID|TID/>\t field to sort by, valid options are TID, SID [required]"
)
) or exit(1);
然后从命令行使用:
$ perl test.pl --sort-by TID
$ perl test.pl --sort-by SID
$ perl test.pl --sort-by FID
Error: incorrect specification of '--sort-by' parameter
Error: required parameter --sort-by not found.
(try 'test.pl -help' for more information)
Getopt :: Declare有一个内置的--help选项,它也会显示规范:
$ perl test.pl --help
Usage: test.pl [options] --sort-by <s>
test.pl -help
test.pl -version
Options:
--sort-by <s> field to sort by, valid options are TID, SID