7

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

有什么好的/更好的方法吗?

4

5 回答 5

16

查看Getopt::Long 手册页中任意字符串的部分解析选项,我认为它完全符合您的要求。

于 2008-09-23T00:15:42.287 回答
7

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

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

于 2008-09-23T00:05:50.657 回答
5

哇!!!

我想我可以同时使用本蒂利和地诺米特的答案并执行以下操作:

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

代码可能看起来像...

GetOptionsFromArray ([glob ($input_line)]);

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

于 2008-09-23T00:23:36.807 回答
0

当您在用户输入以外的其他内容上使用 Getopt::Long 时,请注意某些功能会根据 POSIXLY_CORRECT 环境变量而有所不同。您可以通过对配置的适当调用来覆盖它。

强制性 POSIXLY_CORRECT 轶事

于 2008-09-23T07:22:56.410 回答
0

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

现在,我想我将不得不与当地的@ARGV 一起生活。

于 2008-09-23T10:57:15.943 回答