2012-04-24 15 views
6

Tôi có một tập lệnh có thể nhận được hàng chục đối số/cờ sử dụng Getopt::Long. Một số cờ nhất định không được phép trộn lẫn, chẳng hạn như: --linux --unix không được phép cung cấp cùng nhau. Bây giờ tôi biết tôi có thể kiểm tra bằng cách sử dụng một tuyên bố if, nhưng tôi chắc chắn có một cách sạch hơn và đẹp hơn để làm điều đó.Tránh kết hợp các đối số nhất định với tập lệnh

if các khối có thể trở nên xấu xí nếu tôi không muốn cho phép nhiều kết hợp cờ.

Mọi đề xuất?

Cảm ơn,

Trả lời

3

Nó dường như không phải là Getopt::Long có một tính năng như vậy, và không có gì nhô ra sau một cách nhanh chóng search of CPAN. Tuy nhiên, nếu bạn có thể sử dụng một băm để lưu trữ tùy chọn của bạn, tạo chức năng riêng của bạn dường như không phải là quá xấu xí:

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; 
    } 
} 

này cũng có quy mô tới hơn 2 lựa chọn:

mutex(qw(linux unix windoze));