PerlのGetoptのは::ロング私が前もって定義していない引数を解析することはできますか?
-
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")
ながら$width
はprocess("arg3")
は、80である一方、これは$width
を呼び出します。この機能は、設定オプションの並び替えるを必要とし、セクションを参照してください "設定Getoptの::ロング" を。
この独自のオプションパーサをロールしても良い時間です。私はCPANに見てきたモジュールは、いずれもこの種の機能を提供しない、とあなたは常に解析のボルトとナットを処理する方法の良い感覚を得るために彼らの実装を見て可能性があります。
はさておき、この種のコードは私がGetoptの変種を嫌いになります。
use Getopt::Long;
&GetOptions(
'name' => \$value
);
矛盾総額はさえ見て、長い時間のためのコードのこのスタイルを使用している人々のために、腹立たしいです。