Получить ввод массива с помощью Getoptions в Perl

Я пытаюсь создать файл в Perl, используя Getoptions, и одним из входных данных является массив. Мой код выглядит так:

my $filename = 'grid.sh';
my @job_name;
my $output_file;
my $testbench;
my %opts = (
 'job_name' => \@job_name,
 'output' => \$output_file,
 'testbench' => \$testbench,
);
GetOptions(
  \%opts,
 'job_name=s',
'output=s',
'testbench=s'
);
open(my $fh, '>', $filename) or die "Could not open";
for (my $i=0; $i <= 2; $i++) {
print $fh "Job names are $job_name[$i]";
}
   close $fh;

в моей командной строке я предоставляю ввод как

perl grip_script.pl "-job_name test -job_name test1 -job_name test2"

Но файл не дает правильных данных. Не могли бы вы сказать мне, где я ошибаюсь?

Спасибо


person user2533429    schedule 12.11.2014    source источник
comment
«Несопоставленная правая фигурная скобка» — это ошибка копирования/вставки? И вы используете GetOpt::Long, я полагаю.   -  person bytepusher    schedule 13.11.2014
comment
Я сожалею об этом. Это была ошибка копирования/вставки. Да, я использую GetOpt::Long   -  person user2533429    schedule 13.11.2014


Ответы (2)


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

Попробуйте это вместо этого:

perl grip_script.pl --job_name test --job_name test1 --job_name test2

Как предложил bytepusher, вам также необходимо исправить вызов GetOptions:

GetOptions(
 'job_name=s' => \@job_name,
 'output' => \$output_file,
 'testbench' => \$testbench,
);

С этими двумя изменениями я могу запустить ваш тестовый сценарий и получить ожидаемые результаты.

Выход:

Job names are testJob names are test1Job names are test2

Обратите внимание, что в операторе печати отсутствует разрыв строки, поэтому все три вызова печати отображаются в одной строке.

person Sam Choukri    schedule 12.11.2014

Ваша нотация GetOpts меня сбивает с толку.

Почему вы передаете %opts, а затем еще?

Вы пробовали это?

GetOptions(
    'job_name=s' => \@job_name,
'output=s' => \$output_file,
'testbench=s' => \$testbench,
);

?

Кроме того, см. здесь в документацию дополнительные примеры нескольких переданные значения.

Эти значения появляются только в том случае, если вы не указываете в командной строке, как указал другой ответчик, поэтому вызовите

perl grip_script.pl --job_name test --job_name test2 --job_name test3

а для меня они все в @job_name.

person bytepusher    schedule 12.11.2014
comment
когда я использую примеры, которые вы все упомянули, тогда появляется только моя первая работа, которая «тестируется». Два других test1 и test2 не являются проблемой. - person user2533429; 13.11.2014
comment
хм. Просто заметил себя после того, как немного поиграл. Позвольте мне вернуться к вам ;) - person bytepusher; 13.11.2014
comment
Г-н Сэм Чоукри прав, с моим обозначением и без кавычек, оба в @job_name для меня. - person bytepusher; 13.11.2014
comment
Эй, ребята, у меня все работает. Ваши материалы помогли мне. Спасибо. - person user2533429; 13.11.2014