如何使用GetOpt :: Long :: GetOptions解析字符串?

时间:2008-09-22 23:52:56

标签: perl getopt-long

我有一个带有可能的命令行参数的字符串(使用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
           );

有没有好/更好的方法?

5 个答案:

答案 0 :(得分:15)

查看parsing options from an arbitrary string中的man page for Getopt::Long部分,我认为它确实与您正在寻找的内容相同。

答案 1 :(得分:7)

不使用空格分割,而是使用内置的glob函数。除了在空格上拆分外,还将执行标准命令行扩展,然后返回一个列表。 (例如*会给出一个文件列表等)。我还建议在一般原则上本地化@ARG。

除此之外,这是唯一可以不重写GetOptions的方法。(显然我需要更仔细地阅读文档。)

答案 2 :(得分:5)

哇!!!

我想我可以同时使用bentilly和dinomite的答案并执行以下操作:

  • 使用glob执行标准命令行扩展
  • 将glob之后的数组传递给GetOpt :: Long的GetOptionsFromArray方法(参见here

代码可能看起来像......

GetOptionsFromArray ([glob ($input_line)]);

这只是一行......很酷(我知道我必须做一些错误检查等)..但它很酷......

答案 3 :(得分:0)

当您在用户输入以外的其他内容上使用Getopt :: Long时,请注意某些功能因POSIXLY_CORRECT环境变量而异。您可以通过适当调用Configure来覆盖它。

Obligatory POSIXLY_CORRECT anecdote

答案 4 :(得分:0)

似乎方法GetOptionsFromArray和GetOptionsFromString仅在v2.36中添加,而且Murphy会说我只有2.35版本。

现在,我想我必须和当地的@ARGV一起生活。