如何在不指定perl脚本中的参数名称的情况下解析哈希的所有任意参数。
使用以下参数运行命令应该给出如下的哈希值。
-arg1 = first --arg2 = second -arg3 -arg4 = 2.0013 -arg5 = 100
{
'arg2' => 'second',
'arg1' => 'first',
'arg4' => '2.0013',
'arg3' => 1,
'arg5' => 100
};
这可以使用Getopt :: Long进行,如下所示
GetOptions(\%hash,
"arg1=s",
"arg2=s",
"arg3",
"arg4=f",
"arg5=i");
但是,我的参数列表太长,我不想在GetOptions中指定参数名称。 因此,只调用散列作为参数的GetOptions调用应该找出哪些参数(及其类型为integer / string / floats / lone参数),然后创建一个散列。
答案 0 :(得分:2)
有很多Getopt模块。以下是一些只会像你想要的那样将所有东西都塞进哈希:
我个人永远不会做这样的事情,并且没有任何这些模块的真实世界经验。我总是希望验证每个脚本以进行错误检查,并作为自我记录脚本正在执行和使用的方法。
答案 1 :(得分:1)
试试这个:
#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;
sub getOptions {
my (%opts, @args);
while (@_) {
my $opt = shift;
if ($opt =~ /^-/) {
if ($opt =~ /-+([^=]+)(?:=(.+))?/) {
$opts{$1} = $2 ? $2 : 1;
}
}
else {
push @args, $opt;
}
}
return (\%opts, \@args);
}
my ($opts, $args) = getOptions(@ARGV);
print Dumper($opts, $args);
测试:
$ perl t.pl -arg1=first --arg2=second -arg3 -arg4=2.0013 -arg5=100 datafile
$VAR1 = {
'arg2' => 'second',
'arg1' => 'first',
'arg4' => '2.0013',
'arg3' => 1,
'arg5' => '100'
};
$VAR2 = [
'datafile'
];
答案 2 :(得分:1)
这将按照您的示例的预期工作,
my %hash = map { s/^-+//; /=/ ? split(/=/, $_, 2) : ($_ =>1) } @ARGV;