Getopt::Long
einfach die @ARGV
Liste Parsen als vorgesehen zum Perl-Programm. Wenn die Parameter separate Einträge in der Liste @ARGV
sind, werden sie von Getopt::Long
auf diese Weise analysiert. Ihr Problem besteht darin, dass die Shell jedes Argument als separaten Parameter verwendet, da es keine Anführungszeichen gibt.
Ihre Wahl ist entweder, um die Parameter munge vor Ihrem Perl-Skript ausgeführt wird, oder durch munging @ARGV
sich die Parameter in die Werte zu kombinieren, sie annehmen, sind in sein.
Für die erste Option können Sie verwenden sed
nehmen Sie die Ausgabe Ihres Programms und fügen Sie die fehlenden Anführungszeichen hinzu. Wenn Sie Programm sind spuckt immer heraus Felder wie folgt aus:
prog_name -filter_arg +define BOOST +noconvtest +actuate-long -disp_arg +define size=40 res=30
Sie könnten Rohr, das durch sed
wie folgt aus:
$ orig_prog | sed -e 's/filter_arg /filter_arg "/' -e 's/ -disp_arg /" -disp_arg "/' -e 's/$/"/'
Oder diese:
$ orig_prog | sed -e 's/^\(.*\) -filter_arg \(.*\) -disp_arg \(.*\)$/\1 -filter_arg "\2" -disp_arg "\3"/'
Das wird die Anführungszeichen um Ihre Parameter und es wird so aussehen:
prog_name -filter_arg "+define BOOST +noconvtest +actuate-long" -disp_arg "+define size=40 res=30"
Auf diese Weise wird @ARGV
korrekt eingerichtet werden, so dass die GetOptions
Funktion funktioniert so, wie Sie es wollen.
Der andere Weg ist @ARGV
munge, wenn Sie Perl-Programm sind ausgeführt wird, bevor Sie rufen GetOptions
:
my $value;
my @newArgv;
foreach my $param (@ARGV) {
if ($param =~ /^-/) {
if ($value) {
push (@newArgv, $value);
$value = "";
}
push(@newArgv, $param);
} else {
$value = $value ? "$value $param" : "$param";
}
}
push (@newArgv, $value) if ($value);
@ARGV = @newArgv;
In dem obigen Beispiel @ARGV
die folgenden Werte haben:
@ARGV[0] = -filter_arg
@ARGV[1] = +define BOOST +noconvtest +actuate-long
@ARGV[2] = -disp_arg
@ARGV[3] = +define size=40 res=30
Und , Getopts::Long
sollte nun so funktionieren, wie Sie es möchten. Eine kleine Randnotiz: In neueren Versionen von Getopt::Long
können Sie neben @ARGV
andere Arrays verwenden. Sie legen einfach das Array Sie als erstes Argument verwenden möchten in GetOptions
:
use Getopt::Long qw(GetOptionsFromArray);
GetOptionsFromArray (
\@newArgs,
"filter_arg=s" => \$filter_arg,
"disp_arg=s" => \$disp_arg,
);
Vielen Dank Axeman, David und Colin. Schätzen Sie Ihre schnelle Antwort. Und im wahren Geist von Perl haben Sie gezeigt, wie das Problem auf verschiedene Arten gelöst werden kann! Ich habe viel gelernt, nachdem ich jeden Ihrer Beiträge sorgfältig gelesen habe. Herzliche Grüße. – Silver2010
Verfehlt den Punkt, dass die Optionen von der Shell getrennt wurden, nicht von Perl. – Demi