如何使用GetOptions从两个中请求一个参数?

时间:2018-02-06 09:20:45

标签: perl command-line-interface

我正在尝试在perl中创建一个接受多个CLI args的CLI脚本。我正在使用GetOptions函数解析这些参数。我有2个选项--foo--bar其中一个选项必须与传递给它的相应值一起出现。

有没有办法直接在GetOptions中处理这个问题?或者我是否必须手动为此写支票?

我正在使用Getopt::Long模块。

编辑:当我说:

  

我有2个选项--foo--bar其中一个选项必须与传递给它的相应值一起出现。

我的意思是说这些应该是CLI参数,可以用作:

$ perl my-cli-script.pl --foo somevalue
$ #Or
$ perl my-cli-script.pl --bar someothervalue

但不是

$ perl my-cli-script.pl --foo somevalue --bar someothervalue
$ #or
$ perl my-cli-script.pl

3 个答案:

答案 0 :(得分:5)

事后检查。

GetOptions(
   "help|h|?" => \&help,
   "foo=s"    => \$opt_foo,
   "bar=s"    => \$opt_bar,
)
   or usage();

defined($opt_foo) || defined($opt_bar) )
   or usage("Must specify --foo or --bar");

!( defined($opt_foo) && defined($opt_bar) )
   or usage("Can't specify both --foo and --bar");

@ARGV == 0
   or usage("Too many arguments");

示例usage

sub usage {
   if ( my ($msg) = @_ ) {
      chomp($msg);
      warn("$msg\n");
   }

   my $prog = basename($0);
   warn("Try `$prog --help' for more information.\n");
   exit(1);
}

答案 1 :(得分:2)

我发现这是一个了解使用率很低的xor(独占或)运算符的最佳时机。

GetOptions(
   "foo=s" => \my $foo,
   "bar=s" => \my $bar,
) die "Bad options";

unless ( defined $foo xor defined $bar ) {
    die "You must specify either --foo or --bar, but not both";
}

答案 2 :(得分:-3)

CPAN模块Getopt::Long为您提供该功能。它使用起来非常简单,您可以构建功能非常强大的CLI应用程序。