GetOptions()强制选择字符串

时间:2016-04-05 14:38:52

标签: perl

我一直无法为此制定搜索短语,所以如果已经提出要求,请向我道歉。 (可能已经。)

我正在编写一个新的Perl实用程序的选项是--sortby选项。我给用户的可用选择是:

  • - sortby TID
  • - sortby SID

现在,我很容易非常在GetOptions调用之后实现它,只需检查是否($ opt_sortby eq“SID”|| $ opt_sortby eq“SID”)。 (实际上,我已经编码了一些更优雅但这是另一个问题。)但是我正在努力推动我的知识,看看我是否可以强制这个选择由GetOptions强制执行,比如

GetOptions('sortby=s'  => {"SID" | "TID"});

请注意,我只是使用文档中常用的符号来表示强制性的“其中一种”选择。我并不期望在GetOptions中使用这种确切的语法。

想点什么?

非常感谢。 (Szépenköszönöm,如果G.S.回答: - )

- 雅各布S。

2 个答案:

答案 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