如何使用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一起生活。