Getopt :: Long可以容纳变量选项名称吗?

时间:2011-06-13 14:42:05

标签: perl getopt-long

我正在编写一个可以执行以下操作的脚本:

script-name --resource1 = xxx --resource2 = xxx

但这可以达到50+。有没有办法让GetOpt接受动态选项名称?

4 个答案:

答案 0 :(得分:1)

是否可以使用相同的选项名称repeated

例如:script-name --resource=xxx --resource=xxx

答案 1 :(得分:1)

如下所示自动生成Getopt::Long的选项列表怎么样?由于选项列表可能很长,因此使用Getopt::ArgvFile可以为配置文件提供选项,而不是在命令行中指定它们。

use Getopt::Long;
use Getopt::ArgvFile;
use Data::Dump;

my @n = (1 .. 10);    # how many resources allowed
my %opts = (
    port                  => ':i',
    http_version          => ':s',
    invert_string         => ':s',
    ssl                   => '',
    expect                => ':s',
    string                => ':s',
    post_data             => ':s',
    max_age               => ':i',
    content_type          => ':s',
    regex                 => ':s',
    eregi                 => ':s',
    invert_regex          => '',
    authorization         => ':s',
    useragent             => ':s',
    pagesize              => ':s',
    expected_content_type => ':s',
    verify_xml            => '',
    rc                    => ':i',
    hostheader            => ':s',
    cookie                => ':s',
    encoding              => ':s',
    max_redirects         => ':i',
    onredirect_follow     => ':i',
    yca_cert              => ':s',
);

my %args = ();
GetOptions(\%args,
    map {
        my $i = $_;
        ( "resource$i:s", map { "resource${i}_$_$opts{$_}" } keys %opts )
    } @n
) or die;

dd \%args;

答案 2 :(得分:1)

是的,因为我想知道如何自己做,因为我想接受 - #参数和Getopt :: Long不接受正则表达式的选项名称。所以这就是我所做的:

use Getopt::Long qw(:config pass_through);

my $ret=GetOptions(
    \%gops,
    'lines|l',  # lines/records to display
    ... cut ...
    '<>' => \&filearg,          # Handle file names also attach current options
);

然后我定义了filearg()函数:

sub filearg {
    my $arg=shift;

    # First see if it is a number as in -20 as shortcut for -l 20
        if ($arg =~ /^--?(\d)+$/) {
        $gops{'lines'}=$1;
    } elsif (-f "$arg" && -r "$arg") {
        my %ops=%gops;
        $fops{$arg}=\%ops;
        push(@files, $arg);
    } else {
        push(@badargs, $arg);
    }
    return(undef);
}

所以需要的是pass_through选项,检查你想要什么,并在看到时设置这些东西。上面我有未定义的选项传递给我的函数。我用它来进行文件检查和一个特殊选项 - #其中#是一个整数。如果它不匹配,我添加到badargs数组,因为这样做不会导致GetOptions失败,所以我必须在从GetOptions返回后检查此数组以查看是否看到错误。您还可以通过使用die("!FINISH");结束回调函数来结束选项错误,这将导致GetOptions终止脚本。

我使用它的能力是-20 FILE1 -30 FILE2,因此可以覆盖后续文件的选项。我看到你能够通过检查选项名称的第一部分然后检查值来做类似的事情。因此,如果您的所有选项都以--resource开头,那么请在函数中查找类似的内容:/^--?(resource\w+)=(.*)$/然后添加到选项数组中。

无论如何,希望这有帮助。

答案 3 :(得分:0)

另一种尝试的方法是使用某种配置文件。考虑到您计划获取大量信息,这似乎是最简单的编写和解析方法。