2012-04-24 14 views
6

पर कुछ तर्कों के मिश्रण से बचें मेरे पास एक स्क्रिप्ट है जो Getopt::Long का उपयोग करके तर्कों/झंडे के दसियों को प्राप्त कर सकती है। कुछ झंडे को मिश्रित करने की अनुमति नहीं है, जैसे: --linux --unix को एक साथ आपूर्ति करने की अनुमति नहीं है। अब मुझे पता है कि मैं if कथन का उपयोग करके जांच कर सकता हूं, लेकिन मुझे यकीन है कि ऐसा करने के लिए एक क्लीनर और अच्छा तरीका है।स्क्रिप्ट

if ब्लॉक अगर मैं झंडे के कई संयोजनों को अनुमति नहीं देना चाहता तो बदसूरत हो सकता है।

कोई सुझाव?

धन्यवाद,

उत्तर

3

यह प्रतीत नहीं होता कि Getopt::Long इस तरह के एक सुविधा है, और कुछ भी नहीं एक त्वरित search of CPAN के बाद बाहर चिपक जाता है। हालांकि, अगर आप अपने विकल्पों को स्टोर करने के लिए एक हैश का उपयोग कर सकते हैं, अपने खुद के समारोह बनाने भी बदसूरत प्रतीत नहीं होता:

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

यह भी अधिक से अधिक 2 विकल्पों को आकर्षित करता है:

mutex(qw(linux unix windoze));