Передача массивов в getopt в Perl - PullRequest
       72

Передача массивов в getopt в Perl

0 голосов
/ 26 сентября 2019

Я пытаюсь передать массив Perl в командной строке.

Я читаю инструкции из https://perldoc.perl.org/Getopt/Long.html

мой сценарий

#!/usr/bin/env perl

use strict;
use warnings FATAL => 'all';
use feature 'say';
use autodie ':all';
use Getopt::Long 'GetOptions';

my @array;
GetOptions ("a=s@" => \@array);#'file' indicates string on command line, '=s' means it must be a string
if (defined $array[0]) {#http://perldoc.perl.org/Getopt/Long.html#Options-with-values
    my @z = split(/,/,join(',',@array));
    say 'The array is ' . join (', ', @z);
}

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

con@VB:~/Scripts$ perl array_getopt.pl -a v c d
The array is v

, что неверно, так как оно пропускает c и d

Я также пробовал GetOptions ("a=s" => \@array);, который имеет ту же ошибку.

Я вижу на этой странице что-то, что мне придется повторять один и тот же тег снова и снова, как perl array_getopt.pl -a v -a c -a d, что не понравится конечному пользователю.

Как я могу передать информациюкомандная строка, так что -a v c d перейдет в массив?

1 Ответ

3 голосов
/ 26 сентября 2019

Используйте s{,} вместо s@.Эта опция описана в perldoc Getopt::Long, параграф Опции с несколькими значениями :

Опции могут принимать несколько значений одновременно, например

    --coordinates 52.2 16.4 --rgbcolor 255 255 149

Этоможет быть достигнуто путем добавления спецификатора повтора к спецификации опции.Спецификаторы повтора очень похожи на спецификаторы повтора {...}, которые можно использовать с шаблонами регулярных выражений.Например, приведенная выше командная строка будет обрабатываться следующим образом:

    GetOptions('coordinates=f{2}' => \@coor, 'rgbcolor=i{3}' => \@color);

Пункт назначения для параметра должен быть массивом или ссылкой на массив.

Можно также указать минимальное имаксимальное количество аргументов, которое принимает опция.foo = s {2,4} указывает параметр, который принимает по крайней мере два и максимум четыре аргумента.foo = s {1,} указывает одно или несколько значений;foo: s {,} указывает ноль или более значений параметров.

Точнее, использование:

GetOptions ("a=s{,}" => \@array);

в вашем коде помогает.

...