2011-03-15 105 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