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を出力します。何らかの理由で、どのWebサイトを選択しても、linksと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最初にファイル全体を読み取るため、2 番目と 3 番目の一致ではタグをスキャンするための空の文字列が取得され、一致はゼロになります。http://www.ruby-doc.org/core-1.9.3/IO.html#method-i-readを参照してください:

length が省略されるか nil の場合、EOF まで読み取り、エンコード変換が適用されます。先頭が EOF に達していても、文字列を返します。

最初の読み取り後に入力ポインターを最初に戻すこともできますが、それはファイルに対してのみ機能するため、基本的にデータ全体をバッファーに読み取り、その上でスキャンを使用します。例については、@Hauleth の回答を参照してください。

于 2012-04-09T23:02:08.057 に答える