2011-02-09 79 views
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

您的代码是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以指示它采用参数。

编辑:更新下面每个澄清的答案。

+0

感谢您的回复。但我想我以错误的方式解释这个问题。我定义了%hash,因为每个命令中有超过50个选项,这些选项是静态的,我应该能够从命令中获取它们的值(例如--ip localhost)。这是我的问题。如果我不清楚,请让我知道解释更多。 – 2011-02-09 12:43:16

+0

@马特斯顿:我更新了答案。现在,选项列表从@options数组中生成。这样你可以传递任意数量的期望选项。 – bvr 2011-02-09 13:23:44

+0

根据你的代码,我怎么能打印@options元素我的意思是选项和其相关的参数就像你警告的地图哈希格式? – 2011-02-09 13:29:19

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 
1

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

“自家种植”方法使用地图和连接来生成选项列表。 (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} 
0

结帐MooseX ::的Getopt,它会帮助你两方面:

  1. 让你进入现代OO perl的

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

Checkout MooseX :: App :: Cmd。它会帮助你将逻辑分开。或者App :: Cmd,如果你还不想喝Moose kool-aid。