2011-03-15 5 views
2

사소한 일이라면 용서해주십시오.Perl Escape Quotes 문제

나는이 같은 펄 스크립트 시스템()를 호출하여 XSLT를하고있는 중이 야 :

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

$ INFILE는 XSLT를 사용하여 번역 할 것입니다 xml 파일에 대한 상대 경로를 포함하는 문자열입니다. 이 문자열은 "Intro to Dance.htm"과 같이 문자열에 공백이있는 $ inFile을 제외하고는 제대로 작동합니다. 그런 다음 구문 오류가보고됩니다.

MS-DOS에 있으면 XSLT 명령에서 $ inFile 문자열 주위에 따옴표를 붙여이 문제를 해결할 수 있습니다. 위의 명령에 다음과 같이 탈출을 시도했습니다.

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

작동하지 않습니다. 아무도 어떻게 $ inFile 주위에 따옴표를 넣어야합니까?

감사합니다.

답변

4

목록으로 명령 줄을 system으로 전달하여 셸 (따라서 셸 이스케이프 문제)을 피할 수 있습니다.

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

이 작동하는 방법에 대한 자세한 내용은 system의 perldoc을 참조하십시오.

+0

@friedo : 시도했지만 다음과 같은 오류가 발생했습니다. 연산자가 ./mot_publish.pl 라인 121에서 "java"-Xms256m ' " 근처의 연산자 121에서 예상 됨 ('-Xms256m '앞에 연산자가 누락 되었습니까?). 의견 있으십니까? – Kevin

+1

목록의 각 항목 사이에 쉼표가 필요합니다. – friedo

+0

@Robert : friedo의 코드가 올바르게 보입니다. 올바르게 복사했는지 확실합니까? 복사에 실수를했거나 오류가보고 된 줄의 한두 줄에 있습니다 (그와 같은 구문 분석 오류와 관련된 일반적인 문제입니다). 편집 : friedo는 이미 문제를 발견했습니다. –

1

사실 MS-DOS입니까?

당신은 실제로 작동하지 않았지만 실제로는 일어나지 않았다고했습니다. 오류가 있었습니까? 그게 뭐야? 이것은 Unixish 시스템에있는 경우

, 단지 작은 따옴표를 대체 :

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

즉 MS-DOS 여부에 작동하는지 모르겠어요.

그 쉘 수준에서 유지 될 필요가 있기 때문에 파일 이름이, " 또는 '가 좀 더 복잡 해짐에 포함되어있는 경우 : (. 또는 비슷한)

$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); 

을 인터프리터 쉘 그림 그것을 알아 보자.

+0

감사합니다. "$ inFile = ~ s/([ '"])/\\ $ 1/g; "$ inFile을 따옴표로 묶으시겠습니까? – Kevin

+0

@ 로버트 : 아니요, 모든'''을'\" 다시 말하면, 따옴표로 전체를 묶는 것이 더 안전하도록 따옴표를 이스케이프 처리합니다. 다 인수 솔루션이 더 효과적 일 때 더 좋습니다. – RoUS