2011-03-15 6 views
1

이 샘플 코드가 제대로 작동하지 않는 이유는 무엇입니까?Perl 유니 코드 형식 문제

#/usr/bin/perl 

$a = "aaa%29"; 
$a =~ s/%/\\x/g; 
print "a $a \n"; 
$b = "aaa\x29"; 
print "b $b \n"; 
$c = sprintf($a); 
print "c $c \n"; 

동일한 출력 라인을 3 번 가져오고 싶습니다.

+0

코드가 제대로 작동하지만 분명히 이상한 것을 기대하고 있습니다. 어떤 출력 라인을 원하십니까? "aaa \ x29"또는 "aaa")? – gpvos

+0

두 번째 싶습니다 – ninjaaa

답변

5

당신이 URL을 디코딩하려는 경우, 내 생각으로, 당신은 uri_unescape 기능을 사용한다 URI::Escape 모듈에서.

또는 s{%([0-9A-F]{2})}{chr(hex($1))}egi과 같은 것을 사용하십시오.

+1

url/uri 처리를 위해 미리 빌드 모듈을 사용하는 것이 좋습니다. 수작업으로 만든 정규 표현식보다 오류 발생 가능성이 훨씬 적습니다. – Mat

5

첫 정규 표현식의 경우, 사용할 수 있습니다

$a = "aaa%29"; 
$a =~ s/%([0-9A-F]{2})/chr(hex($1))/gie; 
print "a $a \n"; 

난 당신이 생각 sprintf으로 무엇을하려고 아무 생각이 없습니다. 은 (중 use warnings;과 코드에 경고를 켜거나 perl에 옵션으로 -w을 전달합니다. sprintf 호출이 유효하지 않습니다.)

+0

감사합니다! 나는 전혀 몰랐기 때문에'sprintf'를 시도했습니다. – ninjaaa

+0

첫 번째 정규 표현식이 불완전하고 16 진수 값이 정확히 일치하고 숫자 만 일치하지 않습니다. 수정 됨. – Mat

+0

나는 그가 "aaa \ x29"(작은 따옴표)를 ""aaa \ x29 "'(큰 따옴표)로 sprintf를 사용하여 얻으려고했다고 생각한다. – Konerak

1

'', '\', 'x', '2', '9', '' '는 한 문자로 구성된 문자열 리터럴의 Perl 코드입니다.

'\', 'x', '2', '9'는 다른 시퀀스이며 Perl 구문 분석기로 전달되지 않으며 훨씬 덜 실행됩니다. 또한 sprintf은 특별히 "\"를 처리하지 않습니다. 모든 이스케이프는 "%"로 시작합니다.

그래서 동일한 출력을 얻지 못합니다.