如何检查只定义了-a
或-b
或-c
中的一个?
所以不在一起-a -b
,也不在-a -c
,也不在-b -c
,也不在-a -b -c
。
现在有
use strict;
use warnings;
use Carp;
use Getopt::Std;
our($opt_a, $opt_b, $opt_c);
getopts("abc");
croak("Options -a -b -c are mutually exclusive")
if ( is_here_multiple($opt_a, $opt_c, $opt_c) );
sub is_here_multiple {
my $x = 0;
foreach my $arg (@_) { $x++ if (defined($arg) || $arg); }
return $x > 1 ? 1 : 0;
}
以上是有效的,但不是很优雅。
Here已经是类似的问题,但这是不同的,因为检查两个独占值很容易 - 但这里有多个。
答案 0 :(得分:2)
或者你可以:
die "error" if ( scalar grep { defined($_) || $_ } $opt_a, $opt_b, $opt_c ) > 1;
标量上下文中的grep返回匹配元素的数量。
答案 1 :(得分:1)
sub is_here_multiple { ( sum map $_?1:0, @_ ) > 1 }
sum
由List::Util提供。
哦,对,grep
在标量上下文中计算,所以你需要的只是
sub is_here_multiple { ( grep $_, @_ ) > 1 }