Perl Escape报价问题

时间:2011-03-15 17:54:49

标签: java perl command-line

请原谅我,如果这太琐碎了。

我正在通过在Perl脚本中调用system()来执行XSLT,如下所示:

system("java -Xms256m -Xmx512m -jar $saxonJar -o $tmpFile $inFile $xslFile $saxonParams");

$ inFile是一个字符串,其中包含将使用XSLT翻译的xml文件的相对路径。除了那些在字符串中有空格的$ inFile之外,这个工作正常,例如“舞蹈的介绍”。 htm“,然后它会报告语法错误。

如果这是在MS-DOS中,那么我可以通过在XSLT命令中的$ inFile字符串周围放一个引号来解决这个问题。我确实尝试将escape放在上面的命令中,如:

system("java -Xms256m -Xmx512m -jar $saxonJar -o $tmpFile \"$inFile\" $xslFile $saxonParams");

它不起作用。任何人都可以帮忙我如何在$ inFile周围加上引号?

感谢。

2 个答案:

答案 0 :(得分:4)

您可以通过将命令行作为列表传递给system来避免shell(从而避免shell出现问题)。尝试

system( 'java', '-Xms256m', '-Xmx512m', '-jar', $saxonJar, '-o', $tmpFile, $inFile, $xslFile, $saxonParams );

有关其工作原理的更多信息,请参阅system的perldoc。

答案 1 :(得分:1)

这实际上是MS-DOS吗?

你说它不起作用,但不是实际发生的事情。你收到错误了吗?它是什么?

如果这是在Unixish系统上,只需替换单引号:

system("java -Xms256m -Xmx512m -jar $saxonJar -o $tmpFile '$inFile' $xslFile $saxonParams");

我不知道这是否适用于MS-DOS。

如果文件名包含"',它会变得有点复杂,因为那些需要在shell级别保存:

$inFile =~ s/(['"])/\\$1/g;
system("java -Xms256m -Xmx512m -jar $saxonJar -o $tmpFile \"$inFile\" $xslFile $saxonParams");

(或类似的东西。)

更好的是,使用多参数形式:

system('java', '-Xms256m', '-Xmx512m', '-jar', $saxonJar, '-o', $tmpFile,
       $inFile, $xslFile, $saxonParams);

让解释器和shell弄明白。