我有一个小脚本,我匹配一个字符串,如果字符串多次匹配,则计数器应该增加一个。
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)
当文件中的每一行与模式进行比较时,以及字符串" test"匹配时,计数器应增加1,当计数器变为4时,应打印字符串"计数器",但计数器重置为" 0"每次它匹配模式,不会执行if条件。有没有办法完成这项工作。非常感谢您的帮助。
答案 0 :(得分:0)
将counter = 0
行移出while循环
答案 1 :(得分:0)
您的代码存在一些问题,首先是seek
行
f.seek(0,IO::SEEK_END)
寻求超过文件末尾的0个字节,或者换句话说,文件末尾。如果你试图确保你在文件的开头(我相信Ruby中没有必要),你可以改用rewind
。
接下来,您要在与您的模式匹配的每一行重置计数器,您应该移动
counter = 0
向上,在循环之外,例如,在你打开文件的正下方:
f = File.open(file,"r")
counter = 0
最后,你永远不会关闭文件,这只是你应该进入的一个好习惯:
f.close
如果您允许使用内置方法执行此操作,则应查看grep
返回枚举中每个元素的数组,其中Pattern ===元素。如果提供了可选块,则将每个匹配元素传递给它,并将块的结果存储在输出数组中。
# 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"