2011-02-09 90 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。