如何在perl中包含来自用户输入的单引号

时间:2011-07-03 23:05:47

标签: perl

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

这是我的代码。

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

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

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

3 个答案:

答案 0 :(得分:4)

如果你稍微改变一下使用函数的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

答案 1 :(得分:2)

系统(@ARGV)可能就是你所需要的。

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

如果你传递了system()多个参数,那么就可以在不调用shell的情况下完成 - 这通常更好。您正在使用的方法使用程序的命令行参数,将它们连接成一个字符串,然后将该字符串传递给shell,然后将其拆分为多个参数以供执行。

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

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

答案 2 :(得分:1)

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

(另外,我可以将注意力转移到join函数,而不是手动连接@ARGV