2017-11-25 108 views
-2

我有一個小腳本,其中我匹配一個字符串,並且如果字符串匹配多次,則計數器應增加1。如果字符串匹配多次,請將計數器增加1

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) 

當文件中的每一行進行比較的圖案,並且當字符串「測試」匹配時,計數器應增加1,並且當計數器變爲4它應該打印字符串「計數器」,但計數器每次匹配模式時將重置爲「0」,並且不會執行if條件。有沒有辦法做到這一點。非常感謝您的幫助。

+0

提示:而不是'而TRUE'使用'循環do'。 – tadman

回答

0

你必須與你的代碼幾個問題,第一個就是那個seek

f.seek(0,IO::SEEK_END) 

正在尋求爲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

還值得注意的是,原始代碼通過尋找到最後並用'select'等待新數據在文件上做了一個'tail -f'。 – tadman

+0

是的,尾巴-f是我提到的第一件事......他們可能打算這樣做,但我沒有發現我,儘管從尾巴-f看這完全有可能。他們編碼發佈顯示它只輸出在第四行,並描述說「當它達到4,輸出」,但是修改4將工作顯示每4行 –

0

移動counter = 0行了while循環