0

如何在我的 perl 脚本中不指定参数名称的情况下将所有任意参数解析为哈希。

使用以下参数运行命令应给出如下所示的哈希值。

-arg1=第一个 --arg2=第二个 -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 应该找出参数是什么(以及它们的类型整数/字符串/浮点数/单独参数)并创建一个哈希。

4

3 回答 3

2

有很多 Getopt 模块。以下是一些只会像你想要的那样将所有内容都放入哈希中的内容:

不过,我个人永远不会做这样的事情,并且对这些模块中的任何一个都没有实际经验。我一直致力于验证每个脚本以进行错误检查,并作为一种自我记录脚本正在做什么和使用什么的手段。

于 2014-04-09T03:53:59.100 回答
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'
        ];
于 2014-04-09T03:45:44.783 回答
1

对于您的示例,这将按预期工作,

my %hash = map { s/^-+//; /=/ ? split(/=/, $_, 2) : ($_ =>1) } @ARGV;
于 2014-04-09T05:53:21.313 回答