获取命令行选项及其值

时间:2011-02-09 11:56:30

标签: perl command-line-arguments log4perl

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

考虑这个命令:

./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 个答案:

答案 0 :(得分: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以表明它需要参数。

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

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

答案 2 :(得分:1)

以下代码演示了实现目标的两种方法。

'home grown'方法使用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}

答案 3 :(得分:0)

结帐MooseX :: Getopt,它会帮助你双重:

  1. 让你进入现代的OO perl

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

  3. Checkout MooseX :: App :: Cmd。它也可以帮助你分离你的逻辑。或App :: Cmd,如果你还不想喝Moose kool-aid。