我正在尝试在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
答案 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应用程序。