2012-04-24 11 views
6

Mam skrypt, który może uzyskać dziesiątki argumentów/flag przy użyciu Getopt::Long. Niektóre flagi nie mogą być mieszane, takie jak: --linux --unix nie mogą być dostarczane razem. Teraz wiem, że mogę sprawdzić za pomocą oświadczenia if, ale jestem pewien, że jest to czystszy i ładniejszy sposób, aby to zrobić.Unikanie mieszania pewnych argumentów ze skryptem

if bloki mogą stać się brzydkie, jeśli nie chcę pozwolić na wiele kombinacji flag.

Wszelkie sugestie?

Dzięki,

Odpowiedz

3

Nie wydaje się, że Getopt::Long ma taką funkcję, i nic nie wystaje po szybkim search of CPAN. Jednakże, jeśli można użyć skrótu przechowywać swoje możliwości, tworząc swoją własną funkcję nie wydaje się zbyt brzydki:

use warnings; 
use strict; 
use Getopt::Long; 

my %opts; 
GetOptions(\%opts, qw(
    linux 
    unix 
    help 
)) or die; 

mutex(qw(linux unix)); 

sub mutex { 
    my @args = @_; 
    my $cnt = 0; 
    for (@args) { 
     $cnt++ if exists $opts{$_}; 
     die "Error: these options are mutually exclusive: @args" if $cnt > 1; 
    } 
} 

To skaluje również do ponad 2 opcje:

mutex(qw(linux unix windoze));