结合perl GetoptLong和特殊的单一ARGV案例?

时间:2013-09-26 09:41:15

标签: perl bash scripting parameter-passing

我正在将shell脚本转换为使用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
    [...]

一种选择是在Perl脚本中维护if/else,如下所示:

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,
         [...]
        );

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我很确定这是不可能的。如果您将config_file作为选项而不是参数传递,则可以执行以下操作:

GetOptions(
    'c|config_file' => sub { config_file_method($ARGV[0]) if 1 == scalar @ARGV } ,
    'a|foo:s' => \$foo,
    'b|bar:s' => \bar,
    [...]
);

答案 1 :(得分:1)

我在Getopt::Long文档中没有看到任何支持您要查找内容的内容。

我采取的方法是让GetOptions处理@ARGV。如果@ARGV中仍有任何内容,则可以认为它是配置文件。然后,无需进行-f检查,因为config_file_method子网无论如何都会进行open / die检查。

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

config_file_method($ARGV[0]) if @ARGV;

答案 2 :(得分:0)

Getopt::Long中没有此类选项。

正如你所展示的那样,绝对没有必要。 (它没有为你节省任何工作,但它通过发明一个新的子语言增加了复杂性。)