请原谅我,如果这太琐碎了。
我正在通过在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周围加上引号?
感谢。
答案 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弄明白。