如何使用Perl的Getopt :: Long以用户输入的顺序获取选项?

时间:2008-10-20 05:39:30

标签: perl getopt

我有一个使用Getopt包的现有Perl程序和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 个答案:

答案 0 :(得分:6)

答案 1 :(得分:6)

你有两个指向'require_order'的答案,但我认为这些答案都误解了'require_order'和你寻求的内容。

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

-a file -b

-a和-b都是简单的选项(不参数)。设置'require_order'后,'file'的存在将终止选项,' - b'标志将成为'文件名'。

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

答案 2 :(得分:5)

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

答案 3 :(得分: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

答案 4 :(得分:2)

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

mytool -arg1 value 1 -arg2 value2 -arg3 value3

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

正如我刚才想到的那样,问题并不在于解析组件。它与用于存储它们的哈希对象有关。

如右图所示,如果我们使用默认配置,订单将是相同的。

非常感谢大家。

答案 5 :(得分:1)

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

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

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

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

答案 6 :(得分:0)

非常晚会。我是用option-handling subroutine做的。我的特定用例是,我需要按任意顺序处理任意数量的Private Sub MakeProductUnavailable() Dim myConn Dim myCommand Set myConn = CreateObject("ADODB.Connection") Set myCommand = CreateObject("ADODB.Command" ) myConn.Open ConnString Set myCommand.ActiveConnection = myConn myCommand.CommandText = "UPDATE Product SET Product.Availability='N' WHERE Product.ProductID= " & lngProductID myCommand.Execute myConn.Close End Sub -e <foo>选项,保留该顺序(对于personal project)。

-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调用该子例程以便在它出现时处理该选项。

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