【问题标题】:Getopt::Long getting a string with spaces into a variableGetopt::Long 将带空格的字符串放入变量中
【发布时间】:2011-10-29 19:43:16
【问题描述】:

我正在制作一个使用 Getopt::Long 解析命令行参数的 perl 脚本。但是,我有一个可以接受字符串(带空格)的参数。如何将整个字符串放入变量中。例如:

./script.pl --string=blah blah blah blah yup --another-opt

我需要变量 $string 中的“blah blah blah blah yup”。我知道 Getopt::Long 支持一个参数的多个输入当你知道你将有多少时(我不知道)。这可能吗?

【问题讨论】:

    标签: perl command-line-arguments getopt-long


    【解决方案1】:

    您需要在参数周围加上引号:

    ./script.pl --string="blah blah blah blah yup" --another-opt
    

    或转义空格:

    ./script.pl --string=blah\ blah\ blah\ blah\ yup --another-opt
    

    【讨论】:

    • 换句话说:这是一个 shell 问题,而不是一个 getopt 问题。
    • 您也可以在整个内容周围加上引号:"--string=blah blah blah blah yup"
    • 所以引号不会混淆我的脚本?
    • @MaxMackie:它们仅适用于调用 Perl 脚本的 shell。它们被 shell 删除,脚本不会看到它们。
    【解决方案2】:

    这确实是对MaxMackie对Ernest的回答的问题的回复,但是太长了,所以这里是:

    您的脚本永远不会看到引号,只会看到传递参数的 shell。当您调用脚本(或程序)时,在较低级别上发生的情况是该命令被调用时带有数组中的多个参数。 shell 通常根据空格分割参数。你的程序现在看到的是:

    [0]./script.pl
    [1]--string=blah
    [2]blah
    [3]blah
    [4]blah
    [5]yup
    [6]--another-opt
    

    在字符串周围加上引号或对其进行转义会导致:

    [0]./script.pl
    [1]--string=blah blah blah blah yup
    [2]--another-opt
    

    Shell(尤其是 bash,我敢肯定还有其他的)允许在没有空格的情况下随意穿插引号。 ls -"l""h"ls -lh 相同,因此您可以使用 "--string=blah blah"--string="blah blah"。使用 getopt 解析单个参数,让您可以将它们打乱并使用 --long-name-l 在所有内容都转换为数组项并传递给程序之后发生。外壳与此无关。

    【讨论】:

      【解决方案3】:

      现在让我感到困惑...在以下场景中,我想通过 shell 命令生成一个带引号的命令行参数,然后将其传递给 Perl 脚本,如下所示:

      script.pl `echo --string \"blah blah yup\"`
      

      问题是,GetOptions ("string=s" => \$string) 将字符串的值设置为

      "blah
      

      包含初始双引号字符并在第一个空格处中断。 echo 命令本身会输出带有带引号的字符串的参数,看起来很漂亮:

      --string "blah blah yup"
      

      如果我在没有回显的情况下调用script.pl --string "blah blah yup",则包含字符串的空格会按预期在 Perl 脚本中设置。

      我认为可能是反引号是问题所在,但这些变体也会产生相同的结果:

      script.pl $(echo --string \"blah blah yup\")
      script.pl $(echo "--string \"blah blah yup\"")
      script.pl $(echo --string \"blah\ blah\ yup\")
      script.pl $(echo '--string \"blah blah yup\"')
      

      尽管最后一个示例导致 string=\"blah(包含初始反斜杠 双引号字符)。

      似乎从 shell 命令的 STDOUT 返回的输出没有被 Perl 的参数解析机制以与输入命令行的字符串相同的方式处理。这种明显缺乏字符串可替代性有点令人惊讶,但可能是由于我不理解的 bash 的某些方面。 (顺便说一句,我在 Darwin 上使用 Perl 5.24 和 Linux 上的 5.16 进行了测试)

      【讨论】:

        【解决方案4】:

        虽然我当然同意您应该转义参数,但如果您像我一样遇到无法轻松控制输入的情况,那么实际上可以使用 Getopt::Long 来做到这一点。

        示例:[https://www.jdoodle.com/a/oHG]

        use strict;
        use Getopt::Long qw(GetOptions);
        
        
        my @spaces_string;
        
        GetOptions('test=s{1,}' => \@spaces_string);
        printf "String is: '%s'\n" ,join " ",@spaces_string;
        

        您将您的选项定义为具有 1 个或多个值,将其分配给一个数组,然后将其连接回一个字符串。

        这在文档的“具有多个值的选项”部分中有很好的解释:http://perldoc.perl.org/Getopt/Long.html#Options-with-multiple-values

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-21
          • 2019-08-14
          • 1970-01-01
          • 1970-01-01
          • 2016-08-29
          • 1970-01-01
          • 2011-04-11
          相关资源
          最近更新 更多