Как получить параметры в порядке, введенном пользователем, используя Perl's Getopt :: Long? - PullRequest
3 голосов
/ 20 октября 2008

У меня есть существующая программа на Perl, использующая пакет Getopt и Getopt::Long::Configure с permute в качестве одного из параметров. Однако теперь мне нужно сохранить порядок опций, введенных пользователем. Существует опция $RETURN_IN_ORDER, упомянутая в Long.pm, но, похоже, она вообще нигде не используется.

Когда я передаю return_in_order, я получаю следующую ошибку.


Getopt :: Long: неизвестный параметр конфигурации "return_in_order" в C: / Program Files / IBM / RationalSDLC / common / lib / perl5 / 5.8.6 / Getopt / Long.pm, строка 1199.


Может кто-нибудь сказать мне, если это вообще поддерживается и если да, то правильный способ использования? Если нет, я хотел бы знать другие альтернативы, которые у меня есть.

Спасибо.

Ответы [ 7 ]

6 голосов
/ 20 октября 2008

У вас есть два ответа, указывающих на 'require_order', но я думаю, что оба эти ответа неправильно понимают, что делает 'require_order' и что вы ищете.

Если 'require_order' не установлен, вы можете написать (в командной строке):

-a file -b

Где -a и -b - простые опции (без аргументов). При установленном параметре require_order наличие файла завершает работу параметров, а флаг -b становится именем файла.

Я думаю, что вы ищете, это механизм, который позволяет вам сказать, что «-a» появилось перед «file» и «-b». Я не думаю, что Getopt :: Long поддерживает это. На самом деле я не знаю ни одного модуля Getopt :: *, который бы это делал (кроме моего собственного, неопубликованного, Getopt :: JLSS, который я иногда использую). [ Если вас интересует код, отправьте мне письмо на Gmail, используя точку между именем и фамилией. ]

6 голосов
/ 20 октября 2008

Я думаю, что вы хотите "require_order"

http://perldoc.perl.org/Getopt/Long.html#Configuring-Getopt%3a%3aLong

5 голосов
/ 20 октября 2008

Это называется require_order, в соответствии с моей страницей. : -)

2 голосов
/ 20 октября 2008

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

mytool -arg1 значение 1 -arg2 значение2 -arg3 значение3

И вот почему require_order не особенно полезен.

И, как я только что понял, проблема не совсем в компоненте синтаксического анализа. Именно с хеш-объектом, который используется для их хранения.

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

Спасибо, ребята, в любом случае.

2 голосов
/ 20 октября 2008

Возможно, это помогло бы, если бы вы предоставили пример вызова вашей программы.

Getopt :: Long поддерживает параметры смешивания с обычными "позиционными" аргументами:

./foo --option1 --option2 file1 file2 file3

Если вы анализируете параметры только с помощью GetOptions, файлы с 1 по 3 останутся в @ARGV в порядке их появления. Может быть, вы можете использовать это поведение для достижения того, что вы хотите.

Кроме того, вы можете указать одну и ту же опцию несколько раз и поместить результаты в массив (по порядку!):

#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
my @permute;
GetOptions(
  'p=s' => \@permute,
);

print "$_\n" for @permute;

"perl foo.pl -p = 1 -p = 2 -p = 3 -p = 4" приводит к таким выводам: ( Примечание:"-p X" работает так же, как "- р = Х ")

1
2
3
4
1 голос
/ 13 августа 2013

Требуется знать порядок, в котором были указаны опции, поэтому я все еще использую Getopt :: Mixed. Этот модуль имеет функцию nextOption, которую вы можете зациклить, и она предоставит вам опции в том порядке, в котором они были в командной строке.

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

myscript /usr --include /usr/local/bin --exclude /usr/local

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

0 голосов
/ 28 марта 2018

Очень опоздал на вечеринку. Я сделал это с помощью подпрограммы обработки опций . Мой конкретный вариант использования заключается в том, что мне нужно обрабатывать любое количество опций -e <foo> и -f <foo> в любом порядке, сохраняя этот порядок (для личного проекта ).

use Data::Dumper; use Getopt::Long; use strict; use warnings;
my @Sources;    # Each element is [was -f, parameter]

my $dr_save_source = sub {      # Called each time we see -e or -f
    my ($which, $text) = @_;
    push @Sources, [$which eq "f", $text];
}; # dr_save_source

GetOptions("e=s@" => $dr_save_source, "f=s@" => $dr_save_source);
print Dumper(\@Sources);

Предоставление ссылки на подпрограмму $dr_save_source в качестве значения, связанного со спецификацией опции (=> $dr_save_source), указывает GetOptions на вызов этой подпрограммы для обработки опции, когда она появляется.

Это может показаться немного неуклюжим, поскольку количество опций увеличилось, но это ... опция.

...