2012-05-11 4 views
4

Я выполняю скрипт perl, и мне нужно получить несколько значений из командной строки. Пример:Аргументы командной строки с несколькими значениями

perl script.pl --arg1 op1 op2 op3 

Я использую Getopt :: Long, и я могу получить эту работу:

perl script.pl --arg1 op1 --arg1 op2 --arg1 op3 

Но мне действительно нужно (хочу) первый вариант.

Я проверил в их документации, и это должен делать то, что я хочу:

GetOptions('arg1=s{3}' => \@myArray); 

http://search.cpan.org/~jv/Getopt-Long-2.38/lib/Getopt/Long.pm#Options_with_multiple_values

Но я получаю эту ошибку:

Error in option spec: "arg1=f{3}"

Любые идеи/решения ?

+0

Вам нужна отдельная утилита для аргументов вашего скрипта? Все аргументы, переданные из командной строки, хранятся в массиве $ ARGV.Затем вы можете сортировать и отслеживать их внутри вашего скрипта. источник: http://www.cyberciti.biz/faq/howto-pass-perl-command-line-arguments/ В качестве альтернативы вы можете включить свой один аргумент, и пользователь должен обернуть их в кавычки: perl-скрипт. pl -arg1 «op1 op2 op3» – OrionRogue

+0

Я думал о кавычках и мог бы использовать это, если не найду другого решения. Я знаю, что могу использовать $ ARGV, но у меня много аргументов, и Getopt :: Long действительно помогает отслеживать все и, к сожалению, это изменяет ARGV. – Chris911

+0

Просто идея: может быть, что-то не так с оболочкой. Можете ли вы выполнить некоторую простую отлаженную печать, чтобы быть уверенным, что вы получаете то, что ожидаете от своего сценария? – ArtM

ответ

4

Ваш код работает для меня, но похоже, что эта функция была добавлена ​​только в Getopt :: Long недавно (версия 2.35), поэтому у вас может быть старая версия Getopt :: Long. Пробег

perl -MGetopt::Long -le'print $Getopt::Long::VERSION;' 

, чтобы узнать, какая у вас версия.

+0

Да, я уже проверил версию, и я бегу 2.38. Однако я просто понял, что клиенты могут использовать более старую версию perl или их серверов, поэтому мне, возможно, придется найти другое решение. Тем не менее, странно, что это не работает. – Chris911

+3

Это странно. Если это помогает, я выполнял 2.35 на perl 5.8.8. Если вы хотите продолжать использовать Getopt :: Long, но вы хотите смешивать свою собственную обработку @ARGV, добавьте «Getopt :: Long :: Configure ('pass_through»); перед запуском GetOptions. Таким образом, все, что GetOptions не распознает, осталось в @ARGV, и вы можете обработать его самостоятельно. –

+0

Спасибо, я посмотрю pass_through. Perl v5.10.1 и Getopt :: Long v2.38. – Chris911

4

Я думаю, что ваша проблема может быть f{3}. f используется для float аргументы (действительные числа). Вы должны использовать спецификатор s, если у вас есть строки в качестве аргументов. Что касается количества аргументов, документация говорит:

It is also possible to specify the minimal and maximal number of arguments an option takes. foo=s{2,4} indicates an option that takes at least two and at most 4 arguments. foo=s{,} indicates one or more values; foo:s{,} indicates zero or more option values.

Примите во внимание hise записки от докторов и приспособиться к вашим потребностям.

+0

Мой плохой о f в примере, на котором я фактически использую s. Я уже прочитал документ и попробовал все доступные варианты. – Chris911

2

Я не уверен, почему люди не предлагали это решение, но этот пост настолько стар, наверное, слишком поздно, чтобы быть полезным.

Существует нет автоматического способа сделать это, что я нашел.

Что вам нужно сделать, это цитата многочисленные аргументы и анализировать их в коде:

perl myscript.pl -m 'a b c' 

, а затем разделить -m значение аргумента внутри кода и делать все, что нужно оттуда.

0

Аналогичный вопрос для getoptions function perl multi value not working, я думаю ... В любом случае, кажется, что только использование "optlist=s" => \@list, работает для меня, для хранения дубликатов/повторов в массиве; это моя версия:

$ perl --version | grep This && perl -MGetopt::Long -le'print $Getopt::Long::VERSION;' 
This is perl, v5.10.1 (*) built for i686-linux-gnu-thread-multi 
2.38 

Пример (test.pl):

#!/usr/bin/perl 
use strict; 
use warnings; 
use Getopt::Long; 
my $numone = 0; 
my $numtwo = 1; 
my @list=(); 
my $result; 
$result = GetOptions (
    "numone=i" => \$numone, 
    "numtwo=i" => \$numtwo, 
    "optlist=s" => \@list, 
); 

printf("result: %d;\n", $result); 
printf("numone: %d, numtwo %d, optlist:\n", $numone, $numtwo); 

foreach my $tmplist (@list) { 
    printf(" entry: '%s'\n", $tmplist); 
} 

Испытательный выход:

$ perl test.pl --numone 10 --numtwo 20 --optlist testing --optlist more --optlist options 
result: 1; 
numone: 10, numtwo 20, optlist: 
entry: 'testing' 
entry: 'more' 
entry: 'options'