【问题标题】:how to include single quotes from user input in perl如何在perl中包含来自用户输入的单引号
【发布时间】:2011-09-27 19:24:57
【问题描述】:

用户将要输入输入字符串,例如 Tom's Toy。 然而 perl 脚本抱怨说“unmatched '。”

这是我的代码。

my $commandline="";
while (@ARGV) {
  $_ = shift @ARGV;
  {$commandline .= $_ . ' ';}
}
print " Running $commandline\n";
system ($commandline);

现在如果用户输入的是汤姆的玩具。我只想打印回汤姆的玩具。 然而 perl 抱怨“无与伦比的'。”。 如果我不用户引用它工作正常。 (例如:汤姆玩具很好) 我该如何解决这个问题。

非常感谢任何帮助。 提前致谢

【问题讨论】:

  • 我的 $commandline = join ' ', @ARGV;

标签: perl


【解决方案1】:

如果您稍微切换一下以使用 system $cmd, @args 版本的函数,则不会调用任何 shell,因此无需转义。

my $cmd = shift @ARGV;
my @args = @ARGV;
print " Running $cmd\n";

system $cmd, @args;

我用./test.pl echo Tom\'s Toy 进行了测试,它给出了预期的输出:

 Running echo
Tom's Toy

【讨论】:

  • 感谢您的回复。但是,在您提到的代码中,仍然需要使用反斜杠将输入指定为“hello y\'all”。有没有办法我们可以忽略用户输入中的反斜杠并仍然提出正确的解决方案?
  • @Bhar - 反斜杠用于 shell,而不是 perl。不同的shell可能有不同的转义要求,但你无法完全绕过它
【解决方案2】:

system(@ARGV) 可能就是您所需要的。

如果给 system() 一个参数,并且如果该参数包含任何 shell 元字符(包括空格、引号等),那么该参数将被传递给 shell。 jwodder 非常正确:错误消息来自 shell,而不是来自 Perl。

如果您传递 system() 多个参数,则无需调用 shell 即可完成 - 这通常会更好。您使用的方法采用程序的命令行参数,将它们连接成一个字符串,然后将该字符串传递给 shell,shell 将其拆分回多个参数以供执行。

另一方面,有时您可能想要调用 shell,例如,如果您正在使用管道、I/O 重定向等构建复杂的命令,但您没有不想在 Perl 中设置它。但正如您所见,您必须小心元字符。

“perldoc -f system”更全面地解释了这一点。

【讨论】:

    【解决方案3】:

    如果您只想打印回用户输入,请使用print,而不是systemsystem 将尝试将提供的字符串传递给 shell 以作为命令执行,而 shell 会抱怨不匹配的引号。

    (另外,不是手动连接@ARGV,我可以将您的注意力引向join 函数吗?)

    【讨论】:

    • 我尝试了简单的打印。但结果还是一样。当用户输入有一个单引号(不匹配的 1)时,Perl 出于某种原因抱怨
    猜你喜欢
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2010-12-27
    • 2018-04-19
    • 2021-11-22
    • 2016-03-05
    • 1970-01-01
    相关资源
    最近更新 更多