我想在运行脚本后从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));
但它不起作用。请帮忙。
答案 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,它会帮助你双重:
让你进入现代的OO perl
创建超级简单的命令行应用程序。
Checkout MooseX :: App :: Cmd。它也可以帮助你分离你的逻辑。或App :: Cmd,如果你还不想喝Moose kool-aid。