Question

Je suis en train d'écrire un script qui peut faire quelque chose comme:

--resource1 = xxx

script nom --resource2 = xxx

Mais cela peut aller jusqu'à 50. Y at-il un moyen de faire accepter GetOpt les noms des options dynamiques?

Était-ce utile?

La solution

Qu'en est-génération automatique de la liste d'options pour Getopt :: long comme exemple ci-dessous? Étant donné que la liste des options sera probablement assez long, en utilisant Getopt :: ArgvFile permettent vous fichier de configuration fournissiez avec des options au lieu de les spécifier sur la ligne de commande.

use Getopt::Long;
use Getopt::ArgvFile;
use Data::Dump;

my @n = (1 .. 10);    # how many resources allowed
my %opts = (
    port                  => ':i',
    http_version          => ':s',
    invert_string         => ':s',
    ssl                   => '',
    expect                => ':s',
    string                => ':s',
    post_data             => ':s',
    max_age               => ':i',
    content_type          => ':s',
    regex                 => ':s',
    eregi                 => ':s',
    invert_regex          => '',
    authorization         => ':s',
    useragent             => ':s',
    pagesize              => ':s',
    expected_content_type => ':s',
    verify_xml            => '',
    rc                    => ':i',
    hostheader            => ':s',
    cookie                => ':s',
    encoding              => ':s',
    max_redirects         => ':i',
    onredirect_follow     => ':i',
    yca_cert              => ':s',
);

my %args = ();
GetOptions(\%args,
    map {
        my $i = $_;
        ( "resource$i:s", map { "resource${i}_$_$opts{$_}" } keys %opts )
    } @n
) or die;

dd \%args;

Autres conseils

Ne serait-il travailler avec le même nom de l'option répétée ?

Par exemple: script-name --resource=xxx --resource=xxx

Oui, comme je viens de comprendre comment le faire moi-même que je voulais accepter un - argument # et Getopt :: Longue n'accepte pas regex pour un nom d'option. Voilà donc ce que je l'ai fait:

use Getopt::Long qw(:config pass_through);

my $ret=GetOptions(
    \%gops,
    'lines|l',  # lines/records to display
    ... cut ...
    '<>' => \&filearg,          # Handle file names also attach current options
);

I alors définie la fonction filearg ():

sub filearg {
    my $arg=shift;

    # First see if it is a number as in -20 as shortcut for -l 20
        if ($arg =~ /^--?(\d)+$/) {
        $gops{'lines'}=$1;
    } elsif (-f "$arg" && -r "$arg") {
        my %ops=%gops;
        $fops{$arg}=\%ops;
        push(@files, $arg);
    } else {
        push(@badargs, $arg);
    }
    return(undef);
}

Alors, ce qui est nécessaire est l'option pass_through, un chèque de ce que vous voulez et mettre ces choses quand on le voit. Au-dessus j'avais des options non définies est passé à ma fonction. J'utilise ce pour les contrôles de fichiers et une option spéciale - # où # est un entier. Si elle ne correspond pas à j'ajouter à un tableau badargs, comme faisant cela ne causera pas GetOptions à l'échec, donc je dois vérifier ce tableau après le retour de GetOptions pour voir si des erreurs ont été observées. Vous pouvez également y mettre fin en cas d'erreur d'option en mettant fin à la fonction de rappel avec die("!FINISH"); qui provoquera GetOptions de terminer le script.

Ce que je l'utilise est la possibilité d'avoir quelque chose comme -20 FILE1 -30 FICHIER2, donc les options peuvent être remplacées pour les fichiers suivants. Je vois que vous être capable de faire quelque chose de similaire avec un chèque pour la première partie du nom de l'option et la valeur. Donc, si toutes vos options commencent par --resource alors regarder quelque chose comme ça dans votre fonction. /^--?(resource\w+)=(.*)$/ puis ajouter dans un tableau d'options

Quoi qu'il en soit, espérons que cette aide.

Une autre méthode pour essayer serait d'utiliser simplement une sorte de fichier de configuration. Il semble que cela pourrait être la méthode la plus simple à la fois écrire et Parse, étant donné que vous prévoyez d'avoir une grande quantité d'informations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top