2011-06-13 5 views
1

私のような何かを行うことができますスクリプト書いています:Getopt :: Longは可変のオプション名に対応できますか?

スクリプト名を--resource1 = xxxは--resource2 = xxxは

しかし、これは50+まで行くことができます。 GetOptに動的オプション名を受け入れる方法はありますか?

+1

オプションはこのように動作する必要がありますか?一つのオプションで動作する '--resources = xxx、xxx'のようなことは疑問ですか? – delnan

+0

いいえ、かなり複雑ですから。それはnagiosのための強化されたcheck_httpです。 --resource1 = '/ foo' --resource1_hostheader = 'bar' --resource1_rc = '200'などとなります。だから現在、私はそれらをそれぞれのハッシュに入れます。 %resource_hash、%resource_hostheader_hashなど – gdanko

+0

この情報をいくつかではなく1つのオプションで保存し、繰り返しオプションを使用したい場合があります: '--resource =/foo:bar:200 - ユーザが注文を記憶しない限り、約20種類のオプションが存在し、混乱する可能性があるため、リソースは/ foo2:bar2:300など。 –

答えて

1

下記の例のようにGetopt::Longのオプションリストを自動生成するのはどうですか?オプションの一覧はかなり長くなる可能性が高いので、Getopt::ArgvFileを使用すると、コマンドラインで指定するのではなく、オプションで構成ファイルを指定することができます。 #引数とGetoptの::ロングオプション名の正規表現を受け入れていない - 私はちょうど私が受け入れることを望んでいたとして、それを自分で行う方法を考え出したとして

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; 
+1

私は '@ n'の生成を邪魔するつもりはないと思います。 '$ n'変数を持っていれば、それを必要とするときはいつでもリスト' 1 .. $ n'を生成することができます。これはあまり頻繁ではありません。 – cjm

+0

@cjm - 良い点ですが、この場合はさらに明らかです。 – bvr

1

同じオプション名repeatedで動作しますか?例えば

script-name --resource=xxx --resource=xxx

+1

私はそうは思わない。ここで各リソースで利用できるオプションの数を見てください:http://pastebin.gdanko.net/441 – gdanko

0

しようとするもう一つの方法は、単に設定ファイルのいくつかの並べ替えを使用することです。あなたが大量の情報を持つことを計画しているので、これが書き込みと解析のための最も簡単な方法かもしれないようです。

1

はい、。だから、これは私がやったことです:

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()関数で定義された:だから、何が必要であることpass_throughオプションで何をしたいのチェックを

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); 
} 

をしてたときにそれらのものを設定します見た。上記の私は私の関数に渡される未定義のオプションを持っていました。私はこれをファイルチェックと特別なオプションのために使用します。##は整数です。一致しない場合はbadargs配列に追加します。これによりGetOptionsが失敗することはないため、GetOptionsからエラーが発生したかどうかを確認してからこの配列をチェックする必要があります。また、オプションエラーで終了するには、die("!FINISH");というコールバック関数を終了し、GetOptionsがスクリプトを終了させるようにすることもできます。

私が使用するのは、-20 FILE1 -30 FILE2のようなものを持つことができるため、後続のファイルに対してオプションを上書きすることができます。私はあなたがオプション名の最初の部分とその後の値のチェックと同様のことをすることができることを見ています。したがって、すべてのオプションが--resourceで始まっている場合は、関数内で次のようなものを探してください:/^--?(resource\w+)=(.*)$/次にオプション配列に追加してください。

とにかく、これが役立つことを願っています。

関連する問題