GetOpt::Long::GetOptions で文字列を解析するにはどうすればよいですか?
-
02-07-2019 - |
質問
(Read-Eval-Print-Loop プログラムを使用して) 可能なコマンド ライン引数を含む文字列があり、Getopt::Long に渡されるときにコマンド ライン引数と同様に解析されるようにしたいと考えています。
詳しく説明すると:
文字列があります
$str = '--infile /tmp/infile_location --outfile /tmp/outfile'
新しいオプションを簡単に追加できるように、GetOptions によって解析されるようにしたいと考えています。
私が考えられる回避策の 1 つは、文字列を空白で分割し、@ARGV を新しい配列に置き換えてから GetOptions を呼び出すことです。何かのようなもの ...
my @arg_arr = split (/\s/, $input_line);
# This is done so that GetOptions reads these new arguments
@ARGV = @arg_arr;
print "ARGV is : @ARGV\n";
GetOptions (
'infile=s' => \$infile,
'outfile=s' => \$outfile
);
何か良い方法/より良い方法はありますか?
解決
セクションをチェックしてください 任意の文字列からのオプションの解析 の中に Getopt::Long のマニュアル ページ, 、まさにあなたが探しているものを提供すると思います。
他のヒント
空白で分割する代わりに、組み込みの glob 関数を使用します。空白での分割に加えて、標準のコマンドライン展開が行われ、リストが返されます。(たとえば * はファイルのリストなどを与えます) また、一般原則として @ARG をローカル化することをお勧めします。
それ以外では、これが GetOptions を書き換えずに実行できる唯一の方法です。 (明らかにドキュメントをもっと注意深く読む必要があります。)
おお!!!
bentilly と dinomite の答えの両方を使用して、次のことを実行できると思います。
- glob を使用して標準のコマンドライン展開を実行する
- glob の後の配列を GetOpt::Long の GetOptionsFromArray メソッドに渡します (「 ここ)
コードは次のようになります...
GetOptionsFromArray ([glob ($input_line)]);
そしてそれはたったの1行です..クールです (エラーチェックなどを行う必要があることはわかっています) ..でもカッコいいです...
ユーザー入力以外で Getopt::Long を使用する場合は、POSIXLY_CORRECT 環境変数に基づいて一部の機能が異なることに注意してください。これは、Configure への適切な呼び出しでオーバーライドできます。
GetOptionsFromArray メソッドと GetOptionsFromString メソッドは v2.36 でのみ追加されたようで、マーフィーが言うように、私はバージョン 2.35 しか持っていません。
当面はローカルの @ARGV と暮らすことになると思います。