用户将输入输入字符串,例如Tom's Toy。 然而,perl脚本抱怨说“无与伦比”。“
这是我的代码。
my $commandline="";
while (@ARGV) {
$_ = shift @ARGV;
{$commandline .= $_ . ' ';}
}
print " Running $commandline\n";
system ($commandline);
现在,如果用户输入是Tom's Toy。我只想打印汤姆的玩具。 然而perl抱怨“无与伦比”。“ 如果我没有用户引用它工作正常。 (例如:Tom Toy很好) 我该如何解决这个问题。
非常感谢任何帮助。 提前致谢
答案 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
,而不是system
。 system
将尝试将提供的字符串传递给shell以作为命令执行,并且它是抱怨无法匹配的引用的shell。
(另外,我可以将注意力转移到join
函数,而不是手动连接@ARGV
。