我有一个使用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行。
有人可以告诉我这是否得到支持,如果有,请使用正确的方法?如果没有,我想知道我的其他选择。
感谢。
答案 0 :(得分:6)
我想你想要“require_order”
http://perldoc.perl.org/Getopt/Long.html#Configuring-Getopt%3a%3aLong
答案 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
调用该子例程以便在它出现时处理该选项。
随着选项数量的增加,这可能会有点笨拙,但它是......一种选择。