2017-11-25 4 views
-2

文字列に一致する小さなスクリプトがあります。文字列が複数一致する場合は、カウンタが1つ増えます。文字列が複数回一致する場合は、カウンタを1ずつ増やします。

ファイル内の各ラインパターンと比較され、文字列「テスト」が一致したとき、カウンタは1だけ増加されるべきであり、カウンタが4になった場合、それは文字列「カウンター」を印刷する必要があり
def watch_for(file, pattern) 
    f = File.open(file,"r") 
    f.seek(0,IO::SEEK_END) 

    while true do 
    select([f]) 
    line = f.gets 

    if line =~ pattern 
     counter = 0 
     counter += 1 

     if counter == 4 
     puts counter 
     end 
    end 
    end 


watch_for(file, test) 

が、カウンタパターンに一致するたびに "0"にリセットされ、if条件は実行されません。これを行う方法はありますか?あなたの助けが大変ありがとうございます。

+0

ヒント: 'while true'の代わりに 'loop do'を使用してください。 – tadman

答えて

0

あなたはあなたのコードを持つ夫婦の問題を持って、最初は

f.seek(0,IO::SEEK_END) 

そのseek行は、ファイルの末尾を超えて0バイトに求めているということです、または、言い換えれば、ファイルの終わり。あなたがファイルの先頭にいることを確認しようとしていたら(Rubyでは不要だと思う)、代わりにrewindを使うことができます。

次に、あなたがあなたのパターンに一致するすべての行にあなたのカウンタをリセットしている、あなたは右のファイルを開く場所の下に、例えば、ループの外で、アップ

counter = 0 

を移動する必要があります

f = File.open(file,"r") 
counter = 0 

最後に、あなたが入るべきでちょうど良い習慣である、ファイル、閉じることはありませんしている:

f.close 
を あなたがこれを行うための方法で構築されたの使用を許可している場合

することは、あなたはgrep

を見るべきパターン===要素の列挙内の各要素の配列を返します。オプションのブロックが指定された場合、一致する各要素が渡され、ブロックの結果が出力配列に格納されます。

# calling File.open with a block will automatically 
# close the file at the end of the block 
matched_lines = File.open("./bacon_ipsum.txt") do |file| 
    counter = 0 
    file.grep(/bacon/i) do |matching_line| 
    counter += 1 
    puts counter if counter == 4 

    matching_line 
    end 
end 

puts "found #{matched_lines.length} matching lines" 
+0

これは、インスタンス#4のカウンタのみを表示します。おそらく、4行目ごと、または 'counter%4 == 0'と表示されるはずです。 – tadman

+0

元のコードでは、ファイルを 'tail -f'で終わらせ、新しいデータを' select'で待っていたことにも注意してください。 – tadman

+0

ええ、 'tail -f'が私が言及した最初のことでした...彼らはそれを行うことを意図していたかもしれませんが、完全に可能な' tail -f'の観点から見ています。彼らは4行目に出力しているだけで、4行目に出力すると4行目に表示されます –

0

移動whileループのうちcounter = 0ライン

関連する問題