2011-03-15 95 views
2

如果这太微不足道,请原谅我。Perl逃逸行情问题

我通过调用Perl脚本系统()这样做的XSLT:

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

$ INFILE是包含对要使用XSLT转换XML文件的相对路径的字符串。这工作得很好,除了那些在字符串中有空格的$ inFile,例如像“Intro to Dance.htm”,那么它会报告语法错误。

如果这是在MS-DOS中,那么我可以轻松地通过在XSLT命令中引用$ inFile字符串来引用此问题。我曾尝试在上面的命令中使用escape:

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

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

谢谢。

回答

4

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

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

更多关于如何工作参阅perldoc为system

+0

@friedo:试过了,但出现如下错误:字符串找到了./mot_publish.pl第121行,'java''-Xms256m''' (在'-Xms256m'之前缺少操作符?你有什么建议吗? – Kevin 2011-03-15 18:04:30

+1

您需要列表中每个项目之间的逗号。 – friedo 2011-03-15 18:05:49

+0

@Robert:friedo的代码看起来正确。你确定你已经正确复制了吗?要么你在复制时犯了错误,要么错误是在报告行上面的一行或两行(这是解析类似错误的一般问题)。编辑:friedo的已经发现的问题。 – 2011-03-15 18:07:01

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找出它。

+0

谢谢。是“$ inFile =〜s /(['”])/ \\ $ 1/g;“将$ inFile用引号括起来? – Kevin 2011-03-15 18:27:52

+0

@Robert:不会,它会用'\”替换所有'''''和''''''换成''''换句话说,转义引用将引用中的所有东西放在更安全的位置,但多参数解决方案更好。 – RoUS 2011-03-15 20:27:26