Perl の Getopt::Long の使い方は知っていますが、明示的に定義されていない "--key=value" ペアを受け入れてハッシュに貼り付けるように構成する方法がわかりません。言い換えれば、ユーザーがどのようなオプションを必要としているかは前もってわからないので、それらすべてを定義する方法はありませんが、それらすべてを解析できるようにしたいと考えています。
提案?事前に感謝します。
Perl の Getopt::Long の使い方は知っていますが、明示的に定義されていない "--key=value" ペアを受け入れてハッシュに貼り付けるように構成する方法がわかりません。言い換えれば、ユーザーがどのようなオプションを必要としているかは前もってわからないので、それらすべてを定義する方法はありませんが、それらすべてを解析できるようにしたいと考えています。
提案?事前に感謝します。
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.
通常のオプションが解析されたら、runrigが提供するようなコードを使用してアドホックオプションを解析できます。
Getopt::Longはそれを行いません。オプションを自分で解析できます...例:
my %opt;
my @OPTS = @ARGV;
for ( @OPTS ) {
if ( /^--(\w+)=(\w+)$/ ) {
$opt{$1} = $2;
shift @ARGV;
} elsif ( /^--$/ ) {
shift @ARGV;
last;
}
}
または、Getopt :: Longを変更して処理します(または、必要に応じて、上記のコードを変更して、より多くの種類のオプションを処理します)。
場合によっては、「オプションとハッシュ値」機能を使用できます。
たとえば、オブジェクトの配列を解析するときに、ユーザーが任意のフィルターを設定できるようにしたいと考えました。
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'
};
もちろん、$filters には「filter」に関連付けられた値が含まれます。
幸運を!誰かがこれを役に立てば幸いです。
ドキュメントから:
特別なオプション 'name'
<>
を使用して、オプション以外の引数を処理するサブルーチンを指定できます。GetOptions()
は、オプションのように見えない引数に遭遇すると、すぐにこのサブルーチンを呼び出し、引数名という 1 つのパラメーターを渡します 。まあ、実際には引数名に文字列化するオブジェクトです。
例えば:
my $width = 80; sub process { ... } GetOptions ('width=i' => \$width, '<>' => \&process);次のコマンド ラインに適用した場合:
arg1 --width=72 arg2 --width=60 arg3
process("arg1")
これはwhile$width
is 80、process("arg2")
while$width
is 72、process("arg3")
while$width
is 60 を呼び出します。この機能には構成オプションの置換が必要です。セクション 「Getopt::Long の構成」を参照してください。
これは、独自のオプション パーサーを展開する良い機会です。私が CPAN で見たモジュールのどれも、このタイプの機能を提供していません。そして、いつでもそれらの実装を見て、構文解析の基本をどのように処理するかを理解することができます。
余談ですが、このタイプのコードを見ると、私は Getopt の亜種が嫌いになります。
use Getopt::Long;
&GetOptions(
'name' => \$value
);
一貫性のない大文字化は、このスタイルのコードを長い間見て使用してきた人々にとってさえ、腹立たしいものです。