Самый чистый способ разобрать аргумент с Getopt :: Long - PullRequest
0 голосов
/ 03 декабря 2018

Я использую GetOpt для разбора аргументов командной строки.Я хотел бы добавить новую опцию "multi", которая должна получить строку, которая выглядит следующим образом: key1=abc,key2=123,key3=xwz.Я не знаю, сколько пользовательских ключей хотят дать, но он может дать минимаксные 5 ключи.Кроме того, я хотел бы поместить это в хеш с ключами.Я ищу хороший и чистый способ его реализации.

Для начала я подумал об использовании --multi {key1=abc,key2=123,key3=xwz}, но по какой-то причине он получает только первый ключ key1=abc.Также я попробовал: --multi {key1=abc},{key2=123},{key3=xwz} но это выглядит немного грязно.Я хочу дать пользователю возможность добавлять аргументы с -, как key1=./some_script.pl --help.Часть кода:

my %arg;
GetOptions(
            "multi=s" => \$arg{"multi"},
}

Тогда я бы хотел как-то поместить эти ключи в хеш, чтобы их было легко использовать.Поэтому я подумал об использовании: $arg{"multi"}{"key3"}, чтобы получить значение key3.Как мне подойти к этой функции?Какой самый чистый способ сделать это?

Подводя итог:

  1. Как лучше всего попросить пользователя дать ключи, чтобы получить ситуацию, аналогичную key1=abc,key2=123,key3=xwz без использования файла (предоставление параметров, а не файловым способом)?Смысл - как бы вы хотели, как пользователь сценария, давать эти поля?
  2. Как проверить, что этот пользователь дал менее 5 ключей?
  3. Как мне проанализировать эти ключи и чтоэто лучший способ вставить эти ключи в хэш-карту в ключе multi.

Ожидаемый результат: я хотел бы иметь хэш, который выглядит следующим образом: $arg{"multi"}{"key3"} и возвращает xwz.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Один из способов - присвоить хэшу параметры формата key=value, что GetOpt :: Long позволяет .Еще лучше, поскольку для этой функции просто нужна ссылка на хеш, оказывается, что вы можете назначить ее хэш-ссылке, которая является значением внутри более глубокой структуры данных.Вы можете напрямую использовать это

use warnings;
use strict;
use feature 'say';

use Getopt::Long;
use Data::Dump qw(dd);

my %args;
$args{multi} = {}; 

GetOptions( 'multi=s' => $args{multi} ) or die "Bad options: $!";

dd \%args;

. При многократном вызове этой опции пары ключ-значение добавляются

script.pl --multi k1=v1 --multi k2=v2

, и вышеприведенная программа печатает

{ multi => { k1 => "v1", k2 => "v2" } }

Я использую Data :: Dump для печати сложных данных.Перейдите на ядро ​​Data::Dumper, если это проблема.

Хотя Getopt::Long позволяет ограничить число аргументов, принимаемых опцией, которые, очевидно, применимы только для адресатов массива.Таким образом, вам нужно посчитать количество ключей для проверки.

Другой способ - обработать строку ввода в подпрограмме , где вы можете делать практически все, что захотите.Добавление этого к вышеупомянутому сценарию, чтобы добавить еще один ключ с его хеш-значением к %args

use warnings;
use strict;
use feature 'say';

use Getopt::Long;
use Data::Dump qw(dd);

my %args;
$args{multi} = {};

GetOptions(
    'multi=s' => $args{multi},
    'other=s' => sub { $args{other} = { split /[=,]/, $_[1] }  }
) or die "Bad options: $!";

dd \%args;

Когда вызывается как

script.pl --multi k1=v1 --multi k2=v2  --other mk1=mv1,mk2=mv2

Это печатает

{
  other => { mk1 => "mv1", mk2 => "mv2" },
  multi => { k1 => "v1", k2 => "v2" },
}
0 голосов
/ 03 декабря 2018

Следующая программа считывает разделенные запятыми подопции из опции --multi в командной строке.

#!perl
use strict;
use warnings;
use Data::Dumper;
use Getopt::Long 'GetOptionsFromArray';

my @args = ('--multi', '{key1=abc,key2=123,key3=xwz}', 'some', 'other');

my %arg;
GetOptionsFromArray(
    \@args,
            "multi=s" => \$arg{"multi"},
);

if( $arg{multi} and $arg{multi} =~ /^\{(.*)\}$/) {
    # split up into hash:
    $arg{ multi } = { split /[{},=]/, $1 };
};

print Dumper \%arg;

__END__

$VAR1 = {
          'multi' => {
                       'key2' => '123',
                       'key1' => 'abc',
                       'key3' => 'xwz'
                     }
        };

Программа использует GetOptionsFromArray для удобства тестирования.В реальной программе вы, скорее всего, будете использовать GetOptions(...), что идентично GetOptionsFromArray(\@ARGV, ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...