解析所有参数并存储到哈希

时间:2014-04-09 03:30:30

标签: perl getopt-long

如何在不指定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参数),然后创建一个散列。

3 个答案:

答案 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;