我正在尝试设置Getopt::Long
来处理配置脚本中的参数。
以下是我的starter:
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
my $config_file = '';
GetOptions (
'config|c=s' => \$config_file,
'add|a' => \&add_server,
'del|d' => \&del_server,
);
sub add_server {
print "$config_file\n";
}
sub del_server {
# Left blank for now.
}
字符串
奇怪的是,当我运行我的脚本时,我遇到了一个问题:./config.pl -a -c config.xml
个
它不打印-c
选项,但如果我这样运行它,./config.pl -c config.xml -a
个
它就像它应该的那样工作。
我想我明白了为什么;这跟订单的执行有关系吧?
我该怎么解决?我应该将Getopt::Long
与@ARGV
结合使用吗?
最后,我试图将命令行参数传递到我调用的子例程中。因此,如果-a
或--add
,我希望-c
或--config
的选项在调用子例程时传递到子例程中。
有什么想法吗
5条答案
按热度按时间wbgh16ku1#
我不认为有必要直接从
GetOptions
调用调用子例程。像这样控制顺序:字符串
klsxnrf12#
把这个例子稍微简化一下...
字符串
运行
config.pl -c blurg -a
返回输出Got this for a config file: blurg
,运行config.pl -a -c blurg
返回Got this for a config file:
。所以,我怀疑正在发生的是,选项是按照给出的顺序分配的。因此,在第一种情况下,
$config_file
被分配给-c
参数,然后调用add_server
子例程(使用正确的参数),而在第二种情况下,add_server
立即被无参数地触发,然后分配$config_file
。除此之外,我建议将
-a
设置为布尔值,如果启用了它(并且提供了-c
的参数),则可以执行任何您想执行的操作。wgxvkvu93#
回调在遇到选项时被调用,因此在遇到
-c
之前调用add_server
字符串
根据最新信息,您现在需要:
型
kxe2p93d4#
在Getopt::Long上启用pass_through选项,以便它将忽略未知选项,然后为您的选项调用GetOptions一次,再次禁用它,然后再次为您的命令使用GetOptions。
jxct1oxe5#
字符串