0

Getopt::Long を使用する Perl スクリプトにシェル スクリプトを変換しています。スクリプトへの唯一の引数が単一のファイルである場合、そのファイルが構成ファイルとして使用される以下のケースとの互換性を維持したいと考えています。一方、通常はパラメーターを GetoptLong に取得します。

if [[ $# -eq 1 && -f $1 ]];
then 
    echo "Using config file $1"
    [...]
else 
    if [ $# -lt 2 ]; then usage "INCORRECT NUMBER OF PARAMETERS"; fi
    while getopts ":a:b:c:d:ef" opt;
    do
    [...]

if/else1 つのオプションは、次のように Perl スクリプトでを維持することです。

if (1 == @ARGV && -f $ARGV[0]) {
  # use this config file
  config_file_method($ARGV[0]);
} else {
  # use GetOptions
  GetOptions(
         'a|foo:s' => \$foo,
         'b|bar:s' => \bar,
         [...]
        );
}

しかし、この特殊なケースを魔法のように GetOptions 関数に含めることができるのではないかと思います。

  GetOptions(
         'if only one element in @ARGV' => 'call config_file_method($ARGV[0])',
         'a|foo:s' => \$foo,
         'b|bar:s' => \bar,
         [...]
        );

何か案は?

4

3 に答える 3

1

Getopt::Longのドキュメントには、探しているものをサポートするものは何もありません。

私がとるアプローチは、GetOptions処理させること@ARGVです。何かがまだ にある場合は@ARGV、それが構成ファイルであると見なすことができます。サブはとにかく/チェックを行う-fため、チェックは必要ありません。config_file_methodopendie

GetOptions(
    'a|foo:s' => \$foo,
    'b|bar:s' => \$bar,
);

config_file_method($ARGV[0]) if @ARGV;
于 2013-09-26T13:37:45.637 に答える
0

Getopt::Longにはそのようなオプションはありません。

そして、あなたが示したように、それは絶対に必要ありません. (これによって作業が節約されるわけではありませんが、新しいサブ言語が発明されて複雑さが増しました。)

于 2013-09-26T13:34:24.753 に答える