Frage

Ich schreibe ein Skript, das Folgendes kann:

Skriptname --resource1= xxx --resource2= xxx

Dies kann jedoch bis zu 50+ betragen.Gibt es eine Möglichkeit, GetOpt dazu zu bringen, dynamische Optionsnamen zu akzeptieren?

War es hilfreich?

Lösung

Wie wäre es mit der automatischen Generierung der Optionsliste für Getopt :: Long wieBeispiel unten?Da die Liste der Optionen wahrscheinlich ziemlich lang sein wird, erlauben Sie die Verwendung von Getopt :: ArgvFile Sie müssen die Konfigurationsdatei mit Optionen versehen, anstatt sie in der Befehlszeile anzugeben.

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;

Andere Tipps

Würde es mit demselben Optionsnamen funktionieren? wiederholt ?

Zum Beispiel: script-name --resource=xxx --resource=xxx

Ja, da ich gerade herausgefunden habe, wie ich es selbst machen soll, weil ich ein - # Argument akzeptieren wollte und Getopt :: Long keinen regulären Ausdruck für einen Optionsnamen akzeptiert. Das habe ich also getan:

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

Ich habe dann die Funktion filearg () definiert:

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

Was also benötigt wird, ist die Option pass_through, eine Überprüfung, was Sie wollen, und das Festlegen dieser Dinge, wenn sie gesehen werden. Oben hatte ich undefinierte Optionen an meine Funktion übergeben. Ich benutze dies für Dateiprüfungen und für eine spezielle Option - # wobei # eine ganze Zahl ist. Wenn es nicht übereinstimmt, füge ich es einem badargs-Array hinzu, da dies nicht dazu führt, dass GetOptions fehlschlägt. Daher muss ich dieses Array nach der Rückkehr von GetOptions überprüfen, um festzustellen, ob Fehler aufgetreten sind. Sie können es auch bei einem Optionsfehler beenden lassen, indem Sie die Rückruffunktion mit die("!FINISH"); beenden, wodurch GetOptions das Skript beendet.

Wofür ich es verwende, ist die Fähigkeit, so etwas wie -20 DATEI1 -30 DATEI2 zu haben, sodass Optionen für nachfolgende Dateien überschrieben werden können. Ich sehe, dass Sie etwas Ähnliches tun können, indem Sie den ersten Teil des Optionsnamens und dann den Wert überprüfen. Wenn also alle Ihre Optionen mit --resource beginnen, suchen Sie in Ihrer Funktion nach etwas Ähnlichem: /^--?(resource\w+)=(.*)$/ und fügen Sie es dann in das Optionsarray ein.

Wie auch immer, ich hoffe, das hilft.

Eine andere Methode wäre, einfach eine Konfigurationsdatei zu verwenden.Dies scheint die einfachste Methode zum Schreiben und Analysieren zu sein, da Sie eine große Menge an Informationen planen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top