0

我正在将一个 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
    [...]

一种选择是if/else像这样在 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

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

GetOptions(
    'c|config_file' => sub { config_file_method($ARGV[0]) if 1 == scalar @ARGV } ,
    'a|foo:s' => \$foo,
    'b|bar:s' => \bar,
    [...]
);
于 2013-09-26T10:39:37.680 回答
1

我在Getopt::Long文档中看不到任何支持您正在寻找的内容。

我会采取的方法是让GetOptionsprocess @ARGV. 如果还有任何内容@ARGV,那么您可以假设它是配置文件。然后就不需要-f检查了,因为config_file_methodsub 无论如何都会做open/die检查。

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 回答