为什么这个归零?

时间:2012-04-09 22:51:36

标签: ruby

我有代码:

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的正确数字。这是为什么?

2 个答案:

答案 0 :(得分:4)

当您读取文件时,您也会移动指针。这样写(我还添加了方法链):

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

答案 1 :(得分:3)

f.read在第一次开始读取整个文件,因此第二次和第三次匹配得到一个空字符串以扫描标签,并且您得到零匹配。见http://www.ruby-doc.org/core-1.9.3/IO.html#method-i-read

  

如果省略length或为nil,则读取直到EOF并应用编码转换。即使在开始时遇到EOF,它也会返回一个字符串。

您可能会在第一次读回到开头后重新定位输入指针,但这只适用于文件,因此基本上将整个数据读取到缓冲区,然后使用扫描。请参阅@Hauleth的答案。