2011-03-15 73 views
1

爲什麼這個示例代碼不能正確工作?Perl unicode格式問題

#/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"; 

我想要得到相同的輸出線的三倍。

+0

該代碼正常工作,但顯然你期待着一些奇怪的事情。你想要哪個輸出線? 「aaa \ x29」或「aaa)」? – gpvos 2011-03-15 09:31:59

+0

我想第二個 – ninjaaa 2011-03-15 09:38:58

回答

5

如果你試圖解碼網址,因爲我想,你應該使用uri_unescape功能來自URI::Escape模塊。

或者使用類似s{%([0-9A-F]{2})}{chr(hex($1))}egi的東西。

+1

有關使用預構建模塊進行url/uri處理的好處。比手工構建的正則表達式要少得多。 – Mat 2011-03-15 10:07:17

5

對於第一個正則表達式,你可以使用:

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

我不知道你正在嘗試與sprintf做雖然。 (打開警告在你的代碼或者use warnings;或通過-w作爲一個選項perlsprintf調用無效。)

+0

謝謝!我嘗試了'sprintf'因爲我沒有任何想法:) – ninjaaa 2011-03-15 09:47:51

+0

我的第一個正則表達式不完整,無法正確匹配十六進制值,只有數字。糾正。 – Mat 2011-03-15 09:53:15

+0

我認爲他正在試圖使用sprintf將'aaa \ x29'(單引號)引入''aaa \ x29「'(雙引號)。 – Konerak 2011-03-15 09:53:50

1

'''''','x','2','9','''是創建單字符字符串的字符串文字的Perl代碼。 '','x','2','9'是一個不同的序列,並且它永遠不會傳遞給Perl解析器,更不會被執行。此外,sprintf不專門處理「\」。它所知道的所有逃脫都以「%」開頭。

這就是爲什麼你沒有得到相同的輸出。