PerlのGetoptのは::ロング私が前もって定義していない引数を解析することはできますか?

StackOverflow https://stackoverflow.com/questions/529868

  •  22-08-2019
  •  | 
  •  

質問

私はPerlのGetoptの::ロングを使用する方法を知っているが、私は明示的に定義されていないのいずれかのの「--key =値」のペアを受け入れるように、それを構成することができますかわかりませんハッシュでそれを固執します。言い換えれば、私はそれらのすべてを定義するための方法はありませんので、私は、ユーザーが望むかもしれないものなオプション前もって知っていない、まだ私はそれらすべてを解析することができるようにしたい。

提案?事前に感謝します。

役に立ちましたか?

解決

Getopt::Long のドキュメントには役立つかもしれない設定オプションを提案します>
pass_through (default: disabled)
             Options that are unknown, ambiguous or supplied
             with an invalid option value are passed through
             in @ARGV instead of being flagged as errors.
             This makes it possible to write wrapper scripts
             that process only part of the user supplied
             command line arguments, and pass the remaining
             options to some other program.
通常のオプションが解析されたら、

、あなたは、このようなこと<のhref =「https://stackoverflow.com/questions/529868/using-perls-getoptlong-with-arbitrary-arguments/529914#529914」としてコードを使用することができます>アドホックオプションを解析するためににrunrigによって提供さています。

他のヒント

Getoptの::ロングはそれをしません。あなたはオプションを自分で解析することができます...例えばます。

my %opt;
my @OPTS = @ARGV;
for ( @OPTS ) {
  if ( /^--(\w+)=(\w+)$/ ) {
    $opt{$1} = $2;
    shift @ARGV;
  } elsif ( /^--$/ ) {
    shift @ARGV;
    last;
  }
}

またはGetoptのを修正::ロングそれを扱う(またはあなたがそれを必要とする場合のオプションより多くの種類を処理するために、上記のコードを変更)します。

私は少し部分的だけど、私は、未知の引数を解析するために、過去にGetoptの::どのように使用しました。

潜在的に、あなたが使用することができ、 "<のhrefを=" http://search.cpan.org/~jv/Getopt-Long-2.38/lib/Getopt/Long.pm#Options_with_hash_values」のrel = "nofollowをnoreferrer" >ハッシュ値の」機能とオプションます。

例えば、私は、オブジェクトの配列を解析するときに、ユーザーが任意のフィルタを設定することができるように望んでいた。

GetOptions(my $options = {}, 'foo=s', 'filter=s%')

my $filters = $options->{filter};

そして

のようにそれを呼び出します
perl ./script.pl --foo bar --filter baz=qux --filter hail=eris

どの

..のようなものを構築します
$options = {
          'filter' => {
                        'hail' => 'eris',
                        'baz' => 'qux'
                      },
          'foo' => 'bar'
        };

そして、もちろん$フィルタは「フィルタ」

に関連付けられた値を持つことになります

幸運!私は誰かがこのが役に立ったと評価して願っています。

ドキュメントでから:

引数コールバックする

特別なオプション「名前」<>は、非オプションの引数を処理するためのサブルーチンを指定するために使用することができます。 GetOptions()はオプションのように見えない引数に遭遇すると、それはすぐにこのサブルーチンを呼び出し、それを一つのパラメータ渡します:引数名を。

まあ、実際には、引数名にstringifiesオブジェクトです。

例えば:

    my $width = 80;
    sub process { ... }
    GetOptions ('width=i' => \$width, '<>' => \&process);

次のコマンドラインに適用された場合:

    arg1 --width=72 arg2 --width=60 arg3

process("arg1")が60である間$widthが72で、かつprocess("arg2")ながら$widthprocess("arg3")は、80である一方、これは$widthを呼び出します。

この機能は、設定オプションの並び替えるを必要とし、セクションを参照してください "設定Getoptの::ロング" を。

この独自のオプションパーサをロールしても良い時間です。私はCPANに見てきたモジュールは、いずれもこの種の機能を提供しない、とあなたは常に解析のボルトとナットを処理する方法の良い感覚を得るために彼らの実装を見て可能性があります。

はさておき、この種のコードは私がGetoptの変種を嫌いになります。

use Getopt::Long;
&GetOptions(
    'name' => \$value
);

矛盾総額はさえ見て、長い時間のためのコードのこのスタイルを使用している人々のために、腹立たしいです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top