2012-04-09 80 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的答案作为例子。