我正在将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,
[...]
);
有什么想法吗?
答案 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中没有此类选项。
正如你所展示的那样,绝对没有必要。 (它没有为你节省任何工作,但它通过发明一个新的子语言增加了复杂性。)