3

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

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

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

4

4 回答 4

8

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

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

或转义空格:

./script.pl --string=blah\ blah\ blah\ blah\ yup --another-opt
于 2011-08-18T13:48:08.690 回答
8

这确实是对 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

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

于 2011-08-18T14:03:57.217 回答
1

虽然我当然同意您应该逃避这些论点,但如果您像我一样遇到无法轻松控制输入的情况,那么实际上可以使用 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

于 2018-03-02T07:16:05.810 回答
0

现在让我猜一猜……在以下场景中,我想通过 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 进行了测试)

于 2017-06-30T03:12:27.853 回答