2012-04-09 86 views
1

我的代碼:爲什麼這個歸零?

img = f.read.scan(/<img/) 
img = img.length 
links = f.read.scan(/<a/) 
links = links.length 
div = f.read.scan(/<div/) 
div = div.length 

程序會打開一個鏈接,說http://stackoverflow.com。然後打印img,鏈接和div。出於某種原因,無論我選擇哪個網站,它都會爲鏈接和div返回0,但會爲img返回正確的數字。爲什麼是這樣?

+1

什麼是'f'?在第一個'f.read'可能會返回整個內容,然後在隨後的'f.read'調用中返回一個空字符串,因爲它位於文檔/流的末尾。 – pjumble 2012-04-09 22:54:41

+0

'open(add)do | f |' – Billjk 2012-04-09 22:55:14

+0

f是一個網頁。 – Billjk 2012-04-09 23:10:35

回答

4

原因當你讀文件時,你也移動指針。寫這樣的說法(我還添加方法鏈):

content = f.read 
img = content.scan(/<img/).length 
links = content.scan(/<a/).length 
div = content.scan(/<div/).length 
3

f.read讀取在第一次就整個文件,所以第二和第三場比賽得到一個空字符串來掃描標籤,你會得到零個匹配。請參見http://www.ruby-doc.org/core-1.9.3/IO.html#method-i-read

如果長度被省略或爲零,則會一直讀取,直到應用EOF和編碼轉換爲止。即使在開始時遇到EOF,它也會返回一個字符串。

你可能會重新輸入指針後的第一個讀回到起點,但將只對文件的工作,所以基本上讀取整個數據緩衝區,然後用掃描上。查看@ Hauleth的答案作爲例子。