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

Ruby 如果字符串匹配多次,则将计数器增加1,ruby,function,Ruby,Function,我有一个小脚本,其中我匹配一个字符串,如果字符串匹配多次,计数器应该增加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 ==

我有一个小脚本,其中我匹配一个字符串,如果字符串匹配多次,计数器应该增加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条件。有没有办法做到这一点。非常感谢你的帮助

将counter=0行移出while循环

您的代码有几个问题,第一个是那行

正在查找超过文件结尾0个字节,或者换句话说,文件结尾。如果您试图确保您位于文件的开头,我认为这在Ruby中是不必要的,那么您可以使用

接下来,如果要在与模式匹配的每一行上重置计数器,则应移动

counter = 0
向上,循环外部,例如,在打开文件的正下方:

f = File.open(file,"r")
counter = 0
最后,您永远不会关闭文件,这只是您应该养成的一个好习惯:

f.close
如果允许您使用内置方法来执行此操作,您应该查看

返回模式==元素的枚举中每个元素的数组。如果提供了可选块,则将每个匹配元素传递给它,并且块的结果存储在输出数组中


提示:使用循环do代替while true。这仅显示实例4上的计数器。它可能应该每四行显示一次,或者计数器%4==0。还值得注意的是,原始代码在文件上执行了一种tail-f,通过查找结尾并使用select等待新数据。是的,tail-f是我提到的第一件事……我没有想到他们可能打算这么做,虽然从尾f的角度来看,这是完全可能的。他们的代码显示它只在第四行输出,并且描述说当它达到4时,输出,但是是的,按4修改可以在每第四行显示
f.close
# 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"