3

我有一个现有的 Perl 程序,它使用Getoptpackage 和Getopt::Long::Configurewithpermute作为选项之一。但是,现在我需要保持用户输入的选项的顺序。$RETURN_IN_ORDER中提到了一个选项Long.pm,但似乎根本没有在任何地方使用。

当我通过return_in_order时,我收到以下错误。


Getopt::Long:C:/Program Files/IBM/RationalSDLC/common/lib/perl5/5.8.6/Getopt/Long.pm 第 1199 行的未知配置参数“return_in_order”。


有人可以告诉我这是否受支持,如果支持,正确的使用方式?如果没有,我想知道我还有其他选择。

谢谢。

4

7 回答 7

6

我想你想要“require_order”

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

于 2008-10-20T05:46:59.837 回答
6

您有两个指向“require_order”的答案,但我认为这两个答案都误解了“require_order”的作用和您所寻求的。

如果 'require_order' 未设置,那么您可以编写(在命令行上):

-a file -b

其中 -a 和 -b 都是简单的选项(不带参数)。设置 'require_order' 后,'file' 的存在会终止选项,并且 '-b' 标志变为 'file name'。

我认为您正在寻找的是一种机制,可以让您知道“-a”出现在“文件”和“-b”之前。我不认为 Getopt::Long 支持这一点。事实上,我不知道有任何 Getopt::* 模块可以做到这一点(除了我自己的、未发布的、我有时使用的 Getopt::JLSS)。[如果您对代码感兴趣,请通过 Gmail 给我发送电子邮件,在名字和姓氏之间使用一个点。]

于 2008-10-20T06:25:26.907 回答
5

require_order根据我在这里的手册页,它被称为。:-)

于 2008-10-20T05:45:09.547 回答
2

如果您为您的程序提供一个示例调用,也许会有所帮助。

Getopt::Long 支持将选项与普通的“位置”参数混合:

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

如果仅使用 GetOptions 解析选项,则 file1 到 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=X" 的作用相同)

1
2
3
4
于 2008-10-20T08:08:46.043 回答
2

在我的情况下,要求非常不同,因为命令行参数将是选项和参数的组合,如下所示。

我的工具 -arg1 值 1 -arg2 值2 -arg3 值3

这就是为什么 require_order 不是特别有用的原因。

正如我刚刚发现的那样,问题并不在于解析组件。它与用于存储它们的散列对象一起使用。

正如 tsee right 所指出的,如果我们使用默认配置,顺序将是相同的。

无论如何,谢谢各位。

于 2008-10-20T10:13:17.883 回答
1

需要知道指定选项的顺序是我仍然使用 Getopt::Mixed 的原因。该模块有一个 nextOption 函数,您可以循环访问它,它会按照它们在命令行上的顺序为您提供选项。

我的用例是包含和排除正则表达式:

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

当然,实际发生的情况还取决于我如何通过脚本处理包含和排除,但我需要知道顺序。

于 2013-08-13T17:15:05.723 回答
0

聚会很晚。我使用选项处理子例程来做到这一点。我的特殊用例是我需要以任何顺序处理任意数量的-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调用该子例程以在选项出现时对其进行处理。

随着选项数量的增加,这可能会有点笨拙,但它是......一个选项。

于 2018-03-28T12:28:58.793 回答