2011-08-15 67 views
0

以下Perl代碼不打開預期的網址:爲什麼Perl會在系統調用中用%23替換#?

$word="中文"; 
my $url="http://www.google.com/#source=hp&q=" . $word; 
print $url . "\n"; 
system("open \"$url\""); 

它打開谷歌瀏覽器與URL:中

http://www.google.com/%23source=hp&q=中文 

代替

http://www.google.com/#source=hp&q=中文 

如果我更換系統請致電

system("echo \"$url\""); 

它會打印正確的URL http://www.google.com/#source=hp&q=中文,它會在粘貼到Google Chrome瀏覽器的網址字段時起作用。

這是爲什麼?如何解決它?

[編輯20年8月14日:30CDT]

看來問題是open。沒有

open "http://www.google.com/#source=hp&q=中文" 
open 'http://www.google.com/#source=hp&q=中文' 
open http://www.google.com/#source=hp&q=中文 

的作品。他們都錯誤地將#替換爲%23。有趣的是,如果我只放1個字符的查詢,即用 「中」,而不是 「中文」,我發現這兩個

open "http://www.google.com/#source=hp&q=中" 
open 'http://www.google.com/#source=hp&q=中' 

工作,但不

open http://www.google.com/#source=hp&q=中 

我使用的是Mac OS X 10.6。

+0

您是否嘗試過在系統調用中使用單引號而不是雙引號?像這樣: 'system(「open'$ url'」);' – thelsdj

+0

使用'沒有工作。 –

+0

您是否嘗試過直接從shell運行'open'命令?這個問題可能並不是每個人都知道的,但是通過open和or chrome如何處理來自命令行的URL。 – thelsdj

回答

1

對原始問題的直接回答是:它沒有。 (我不明白這一點; OP提到,在編輯問題時)

由於OP在編輯問題時說過,它絕對是open命令,而不是Perl或system(),這樣做並且使用單引號而不是雙引號應該沒有區別)。

請注意,open似乎是特定於MacOS(我的Ubuntu系統上有一個open命令,但它不是一回事)。 Here's the man page

部分的說明是%23'#"字符的十六進制表示。 URL通常使用此機制來轉義在URL中具有某些含義的字符。例如,在google.com搜索框中輸入"foo#bar"會產生以下網址:http://www.google.com/search?q=%22foo%23bar%22

的問題是,爲什麼open更換因%23'#'應該被視爲元字符處理?這可能是open中的一個錯誤,或者可能有解決方法。也許有人更喜歡MacOS可以幫助。

只是胡亂猜測:如果您在命令行中輸入

open 'http://www.google.com/\#source=hp&q=中文' 

會發生什麼?

+0

根據您的建議,它會打開http://www.google.com/%5C%23source=hp&q=中文,這也是錯誤的。 –