0

我想在运行脚本后从用户命令中记录选项及其参数。

考虑这个命令:

./test.pl --ip localhost --id 400154 --class firstgrade 

...以及许多其他选项和值。我想要的输出是这样的(通过使用 log4perl):

debug - ip=>localhost id=>400154 class=>firstgrade 

我愿意:

use Getopt::Long; 
my $ip;
my $id; 
my $class;
my %h =('ip' => \$ip,
        'id' => \$id,
    'class' => \$class);
GetOptions(\%h);
$logger->debug(join('=>',%h));

但它不起作用。请帮忙。

4

4 回答 4

4

您的代码是两个不同特征的奇怪组合Getopt::Long- 它可以将选项解析为哈希或将单个选项填充到变量中。甚至可以将部分放入散列并将其余部分放入变量中。

这应该有效:

use Getopt::Long;

my @options = qw(ip id class);
my %h = ();
GetOptions(\%h,
    map { "$_:s" } @options
) or die "Could not parse";
warn map { "$_=>$h{$_} " } keys %h;

这是将解析的选项放入散列的变体。在每个选项后注明:s以表明它需要一个参数。

编辑:根据下面的说明更新了答案。

于 2011-02-09T12:16:28.710 回答
1

下面的代码演示了两种方法来实现你想要的。

“本土”方法使用 map 和 join 来生成选项列表。(grep 消除了 undef 选项。您可以删除 grep {} 部分。)

Data::Dumper 方法可能是可取的,因为它是可评估的。


#!/usr/bin/env perl

use strict;
use warnings;

use Getopt::Long qw(:config gnu_getopt);
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;
$Data::Dumper::Indent = 0;
$Data::Dumper::Terse = 1;

my %opts = (
  dir => undef,
  verbose => 0,
  silent => 0,
 );

GetOptions(\%opts,
           'dir|d=s',
           'verbose|v+',
           'silent+',
          )
  or die("Usage: blah\n");

# also see Getopt::Long perldoc for pod2usage

print( "home grown:\n",
       join(" ", map { sprintf('%s=>%s',$_,$opts{$_}||'undef') } 
              grep {defined $opts{$_}} keys %opts ),
       "\n" );

print( "Dumper:\n",
       Dumper(\%opts), 
       "\n" );

例子:

apt12j$ ~/tmp/x.pl  -vv --silent
home grown:
verbose=>2 silent=>1
Dumper:
{'dir' => undef,'silent' => 1,'verbose' => 2}
于 2011-02-10T05:23:22.257 回答
1

尝试这个:

my $ip = ""; my $id = ""; my $class= "";
GetOptions('ip=s' => \$ip, 'id=s' => \$id, 'class=s' => \$class);
print "debug - ip=>$ip id=>$id, class=>$class";

你可能应该这样称呼它:

./test.pl --ip localhost --id 400154 --class firstgrade
于 2011-02-09T12:29:30.997 回答
0

结帐 MooseX::Getopt,它将为您提供两方面的帮助:

  1. 带你进入现代 OO perl

  2. 创建超级简单的命令行应用程序。

结帐 MooseX::App::Cmd。它还可以帮助您将逻辑分开。或者 App::Cmd 如果你还不想喝 Moose kool-aid。

于 2011-02-10T18:47:24.860 回答