2012-06-22 72 views
2

感謝您的閱讀。Perl wget引用語法問題

對於shell命令wget的,像這樣的工作:

wget -q -O - http://www.myweb.com | grep -oe '\w*.\w*@\w*.\w*.\w\+' | sort -u 

然而,當我嘗試插入Perl程序內部的命令,然後我得到一個語法錯誤指的是「發現反斜槓,其中運營商預計,發現操作員預期的裸詞「。因此,我用這個{}替換了正則表達式附近的引號,但是這樣做就像註釋掉它,它不會帶來錯誤,但它好像正則表達式不是,顯然大括號是錯誤的嘗試。

這是代碼,它是一個foreach內:

foreach(@my_array) { 

$browser->get($_); 
# and here below is where the error comes 
system ('wget -q -O -"$_" | grep -oe '\w*.\w*@.\w*.\w\+' | sort -u'); 

如果我更換了單引號包裹由{正則表達式},然後wget的確實得到了網址,但grep命令不採取行動。

所以這是問題,如何解決引號煩人的語法

回答

2

你想這樣的:

system ("wget -q -O -\"$_\" | grep -oe '\\w*.\\w*@.\\w*.\\w\\+' | sort -u"); 

您可以加入雙引號中喜歡什麼,只有你有逃避某些字符。

順便說一句,Perl的qq()運營商可能會感興趣。你可以查查看。

+0

謝謝你們兩位,非常感謝,現在我怎麼能感謝你們兩位的正確答案?我相信這兩個都是對的,不是嗎? – iaintunderstand

+0

您可以同時使用,但只能接受*一個。如果它解決了這個困境,你可以接受@ simbabque的答案,因爲我目前比他擁有更多的聲望點,所以這會給他帶來可喜的提升。感謝您的詢問。 – thb

+0

你可以同時選擇這個答案和選擇這個答案,因爲@thb先回答,或者選擇一個你更喜歡的答案。樂於幫助。 – simbabque

4

您在系統調用中使用了單引號'。他們不會爲你填寫變量。 $_沒有被替換。另外,grep旁邊的單引號使這個無效語法成爲可能。

試試這個:

system ("wget -q -O - $_ | grep -oe '\w*.\w*\@.\w*.\w\+' | sort -u"); 

您還可以使用qq操作:

system (qq(wget -q -O - $_ | grep -oe '\w*.\w*\@.\w*.\w\+' | sort -u)); 

而且,看perlop.


另一種思考:如果你有$browser對象那可以get()的網址,爲什麼你需要使用wget?你也可以在Perl中做到這一點。

+0

這不是一個錯誤的答案,但'wget -q -0 - 「foo bar」'與'wget -q -0 - foo bar'不太一樣。 OP不想保留報價?另外,至少在我的Perl解釋器上,不使用反斜槓似乎不起作用,即使它看起來也會在我看來代表糟糕的風格。 – thb

+0

這兩個答案都是正確的,都值得信貸,我怎麼能相信你們兩個? – iaintunderstand

+0

謝謝,thb。我剛剛檢查了反斜槓。由於OP不使用'\ n'之類的東西,所以這個工作不會逃脫。我同意他們逃脫會更清楚。我把它排除在外不要混亂。關於單引號,在命令行示例中,他們不在那裏。我認爲OP把它們放在perl代碼中,因爲他認爲這會填充變量。 – simbabque