Getopt::Long
просто анализирует список @ARGV
, предоставленный программе Perl.Если параметры являются отдельными записями в списке @ARGV
, Getopt::Long
проанализирует их таким образом.Ваша проблема в том, что оболочка помещает каждый аргумент в качестве отдельного параметра, так как вокруг них нет кавычек.
Вы можете либо изменить параметры перед запуском скрипта Perl, либо самим @ARGV
объедините параметры в значения, в которых они должны быть.
Для первого варианта вы можете использовать sed
, чтобы получить выходные данные вашей программы и добавить пропущенные кавычки.Если ваша программа всегда выдает поля, подобные этому:
prog_name -filter_arg +define BOOST +noconvtest +actuate-long -disp_arg +define size=40 res=30
Вы можете передать это через sed
следующим образом:
$ orig_prog | sed -e 's/filter_arg /filter_arg "/' -e 's/ -disp_arg /" -disp_arg "/' -e 's/$/"/'
Или вот это:
$ orig_prog | sed -e 's/^\(.*\) -filter_arg \(.*\) -disp_arg \(.*\)$/\1 -filter_arg "\2" -disp_arg "\3"/'
Это поместит кавычки вокруг ваших параметров и будет выглядеть так:
prog_name -filter_arg "+define BOOST +noconvtest +actuate-long" -disp_arg "+define size=40 res=30"
Таким образом, @ARGV
будет настроен правильно, поэтому функция GetOptions
будет работать так, как вы хотите
Другой способ - выполнить munge @ARGV
после запуска Perl-программы перед вызовом 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;
. В приведенном выше примере @ARGV
будетимеют следующие значения:
@ARGV[0] = -filter_arg
@ARGV[1] = +define BOOST +noconvtest +actuate-long
@ARGV[2] = -disp_arg
@ARGV[3] = +define size=40 res=30
И, Getopts::Long
теперь должно работать так, как вы хотите. Небольшое примечание : В новых версиях Getopt::Long
вы можете использовать другие массивы, кроме @ARGV
.Вы просто помещаете массив, который хотите использовать, в качестве первого аргумента в GetOptions
:
use Getopt::Long qw(GetOptionsFromArray);
GetOptionsFromArray (
\@newArgs,
"filter_arg=s" => \$filter_arg,
"disp_arg=s" => \$disp_arg,
);