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、links 和 div。出于某种原因,无论我选择哪个网站,它都会为链接和 div 返回 0,但为 img 返回正确的数字。为什么是这样?

4

2 回答 2

4

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

content = f.read
img = content.scan(/<img/).length
links = content.scan(/<a/).length
div = content.scan(/<div/).length
于 2012-04-09T22:56:43.680 回答
3

f.read第一次读取整个文件,所以第二个和第三个匹配得到一个空字符串来扫描标签,你得到零匹配。请参阅http://www.ruby-doc.org/core-1.9.3/IO.html#method-i-read

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

您可以在第一次读回开始后重新定位输入指针,但这仅适用于文件,因此基本上将整个数据读取到缓冲区,然后对其使用扫描。有关示例,请参见@Hauleth 的答案。

于 2012-04-09T23:02:08.057 回答