如何使用GetOpt :: Long :: GetOptions解析字符串?
时间:2020-03-06 14:34:20 来源:igfitidea点击:
我有一个包含可能的命令行参数的字符串(使用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 );
有什么好/更好的方法吗?
解决方案
而不是在空格上分割,而是使用内置的glob函数。除了在空格上分割外,这还将进行标准的命令行扩展,然后返回一个列表。 (例如*会给出文件列表等。)我还建议按照一般原则对@ARG进行本地化。
除此之外,这是无需重写GetOptions即可实现的唯一方法。 (显然,我需要更仔细地阅读文档。)
在手册页中从Getopt :: Long的任意字符串中查看部分解析选项,我认为它完全可以满足需求。
哇!!!
我想我可以同时使用Bentilly和Dinomite的答案,并执行以下操作:
- 使用glob执行标准命令行扩展
- 将glob之后的数组传递给GetOpt :: Long的GetOptionsFromArray方法(请参见此处)
代码可能看起来像...
GetOptionsFromArray ([glob ($input_line)]);
那只是一行..很酷(我知道我必须做一些错误检查等)..但是它很酷...
当我们在用户输入以外的其他地方使用Getopt :: Long时,请注意,某些功能根据POSIXLY_CORRECT环境变量而有所不同。我们可以使用对Configure的适当调用来覆盖它。
强制性POSIXLY_CORRECT轶事。
似乎方法GetOptionsFromArray和GetOptionsFromString仅在v2.36中添加,并且正如Murphy所说的,我只有2.35版。
就目前而言,我认为我将不得不与本地@ARGV一起生活。