如果字符串匹配多次,请将计数器增加1

时间:2017-11-25 21:13:23

标签: ruby function

我有一个小脚本,我匹配一个字符串,如果字符串多次匹配,则计数器应该增加一个。

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条件。有没有办法完成这项工作。非常感谢您的帮助。

2 个答案:

答案 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"