我有一个带有可能的命令行参数的字符串(使用Read-Eval-Print-Loop程序),我希望它在传递给Getopt :: Long时被解析为类似于命令行参数。
详细说明:
我有一个字符串
$str = '--infile /tmp/infile_location --outfile /tmp/outfile'
我希望它被GetOptions解析,以便我更容易添加新选项。
我能想到的一个解决方法是将字符串拆分为空格并将@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
);
有没有好/更好的方法?
答案 0 :(得分:15)
查看parsing options from an arbitrary string中的man page for Getopt::Long部分,我认为它确实与您正在寻找的内容相同。
答案 1 :(得分:7)
不使用空格分割,而是使用内置的glob函数。除了在空格上拆分外,还将执行标准命令行扩展,然后返回一个列表。 (例如*会给出一个文件列表等)。我还建议在一般原则上本地化@ARG。
除此之外,这是唯一可以不重写GetOptions的方法。(显然我需要更仔细地阅读文档。)
答案 2 :(得分:5)
哇!!!
我想我可以同时使用bentilly和dinomite的答案并执行以下操作:
代码可能看起来像......
GetOptionsFromArray ([glob ($input_line)]);
这只是一行......很酷(我知道我必须做一些错误检查等)..但它很酷......
答案 3 :(得分:0)
当您在用户输入以外的其他内容上使用Getopt :: Long时,请注意某些功能因POSIXLY_CORRECT环境变量而异。您可以通过适当调用Configure来覆盖它。
答案 4 :(得分:0)
似乎方法GetOptionsFromArray和GetOptionsFromString仅在v2.36中添加,而且Murphy会说我只有2.35版本。
现在,我想我必须和当地的@ARGV一起生活。