5

-aorの 1 つだけが定義されている-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;
}

上記は機能していますが、あまりエレガントではありません。

すでに同様の質問がありますが、 2 つの排他的な値をチェックするのは簡単なので、これは異なりますが、ここでは複数の値があります。

4

2 に答える 2

3

または、次のことができます。

die "error" if ( scalar grep { defined($_) || $_  } $opt_a, $opt_b, $opt_c  ) > 1;

スカラーコンテキストのgrepは、一致した要素の数を返します。

于 2012-06-10T07:48:43.660 に答える
1
sub is_here_multiple { ( sum map $_?1:0, @_ ) > 1 }

sumList::Utilによって提供されます。


そうそうgrep、スカラー コンテキストでカウントするので、必要なのは

sub is_here_multiple { ( grep $_, @_ ) > 1 }
于 2012-06-10T07:27:38.170 に答える