2012-04-24 8 views
6

Tengo un script que puede obtener decenas de argumentos/indicadores usando Getopt::Long. Ciertos distintivos no se pueden mezclar, por ejemplo: --linux --unix no se pueden suministrar juntos. Ahora sé que puedo verificar usando una declaración if, pero estoy seguro de que hay una forma más limpia y más agradable de hacerlo.Evitar la mezcla de ciertos argumentos en el script

if bloques pueden ponerse feas si no quiero permitir muchas combinaciones de banderas.

¿Alguna sugerencia?

Gracias,

Respuesta

3

No parece que Getopt::Long tiene una característica, y nada se pega a cabo después de una rápida search of CPAN. Sin embargo, si se puede utilizar un hash para almacenar sus opciones, la creación de su propia función no parece demasiado feo:

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

Esto también se escala para más de 2 opciones:

mutex(qw(linux unix windoze)); 
Cuestiones relacionadas