【问题标题】:How do I parse a string with GetOpt::Long::GetOptions?如何使用 GetOpt::Long::GetOptions 解析字符串?
【发布时间】:2008-09-22 23:52:56
【问题描述】:

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

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

【问题讨论】:

    标签: perl getopt-long


    【解决方案1】:

    查看man page for Getopt::Long 中的parsing options from an arbitrary string 部分,我认为它完全符合您的要求。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        哇!!!

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

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

        代码可能看起来像...

        GetOptionsFromArray ([glob ($input_line)]);
        

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

        【讨论】:

        • 第一个参数是一个数组引用,所以你想要 "GetOptionsFromArray([glob($input_line)],...)"
        【解决方案4】:

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

        Obligatory POSIXLY_CORRECT anecdote.

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-02-05
            • 2015-07-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-14
            • 1970-01-01
            相关资源
            最近更新 更多