GetOpt::Long::GetOptions で文字列を解析するにはどうすればよいですか?

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

  •  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 への適切な呼び出しでオーバーライドできます。

必須の POSIXLY_CORRECT の逸話.

GetOptionsFromArray メソッドと GetOptionsFromString メソッドは v2.36 でのみ追加されたようで、マーフィーが言うように、私はバージョン 2.35 しか持っていません。

当面はローカルの @ARGV と暮らすことになると思います。

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