Getopt :: Long将包含空格的字符串转换为变量

问题描述 投票:2回答:4

我正在制作一个使用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
4个回答
8
投票

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

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

或逃离空间:

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

8
投票

这真的是对MaxMackie关于欧内斯特答案的问题的回复,但它太长了,所以这里是:

您的脚本永远不会看到引号,只看到传递参数的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

贝壳(特别是bash,其他我很确定)允许在没有空格的情况下点缀引号。 ls -"l""h"ls -lh相同,因此你做"--string=blah blah"--string="blah blah"。用getopt解析各个参数,让你把它们排除在外并使用--long-name-l在一切都变成数组项并传递给程序后发生。 shell与此无关。


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


0
投票

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

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

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

"blah

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

--string "blah blah yup"

如果我在没有echo的情况下调用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进行了测试)

© www.soinside.com 2019 - 2024. All rights reserved.