Как получить параметры в порядке, введенном пользователем, используя Perl Getopt::Long?

У меня есть существующая программа 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.


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

Спасибо.


person Jay    schedule 20.10.2008    source источник


Ответы (7)


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

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

person SquareCog    schedule 20.10.2008

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

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

-a file -b

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

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

person Jonathan Leffler    schedule 20.10.2008

Согласно справочной странице, которая у меня есть здесь, она называется require_order. :-)

person Chris Jester-Young    schedule 20.10.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" работает так же, как "-p= ИКС")

1
2
3
4
person tsee    schedule 20.10.2008

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

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

И именно поэтому require_order не особенно полезен.

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

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

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

person Jay    schedule 20.10.2008

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

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

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

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

person Alex Aminoff    schedule 13.08.2013

Очень опоздал на вечеринку. Я сделал это с помощью подпрограммы обработки параметров. Мой конкретный вариант использования заключается в том, что мне нужно обрабатывать любое количество параметров -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 вызывать эту подпрограмму для обработки опции всякий раз, когда она появляется.

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

person cxw    schedule 28.03.2018