2

我正在尝试设置 Getopt::Long 来处理来自配置脚本的参数。

这是我的开胃菜;

#!/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 or --add我希望在-c or --config调用子程序时将选项传递给子程序。

有任何想法吗?

4

5 回答 5

3

我认为不需要直接从GetOptions调用中调用子例程。像这样控制顺序:

use strict;
use warnings;
use Getopt::Long;

my %opts = (config => '');

GetOptions(\%opts, qw(
   config|c=s
   add|a
   del|d
));

add_server() if $opts{add};
del_server() if $opts{del};

sub add_server {    
    print "$opts{config}\n";
}

sub del_server {}
于 2011-12-13T01:01:59.977 回答
0
GetOptions(
        'arg=s' => sub { print "$_[1]\n"; },
);
于 2014-07-02T14:51:28.077 回答
0

稍微简化一下这个例子......

use strict;
use warnings;
use Getopt::Long;

my $config_file = '';

GetOptions (

    'config|c=s' => \$config_file,
    'add|a' => sub{add_server($config_file);}
);

sub add_server
{

    my $config=shift;

    if(defined($config))
    {
        print "Got this for a config file: $config\n";
    }
    else
    {
        print "No argument supplied to add_server\n";
    }

}

...运行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提供了一个参数)。

于 2011-12-13T00:53:54.147 回答
0

回调在遇到选项时被调用,所以在你add_server之前遇到的时候被调用-c

./config.pl -a -c config.xml

根据最新信息,您现在想要:

use Getopt::Long qw( GetOptions );

GetOptions(
   'a=s' => \my $opt_a,
   'd=s' => \my $opt_d,
   'h=s' => \my $opt_h,
   'p=s' => \my $opt_p,
) or usage();
于 2011-12-13T01:33:03.923 回答
-1

在 Getopt::Long 上启用pass_through选项,以便它忽略未知选项,然后为您的选项调用一次 GetOptions,再次禁用它,然后再次为您的命令使用 GetOptions。

于 2011-12-13T00:48:07.097 回答