1

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

脚本名称 --resource1=xxx --resource2=xxx

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

4

4 回答 4

1

是否可以重复使用相同的选项名称?

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

于 2011-06-13T14:52:12.953 回答
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;
于 2011-06-13T19:41:48.037 回答
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+)=(.*)$/然后添加到选项数组中。

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

于 2011-07-25T10:58:00.347 回答
0

另一种尝试的方法是只使用某种配置文件。鉴于您计划拥有大量信息,这似乎是最简单的编写和解析方法。

于 2011-06-13T15:54:01.253 回答