Вземете въвеждане на масив с помощта на 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