From: Robert Klemme Date: 2008-06-26T21:43:53+09:00 Subject: Re: How to find second match in a file 2008/6/25 Cheyne Li : > Hi, everyone > > My code opens a file and read line by line to find a given string as > first match. After I found one, how can i find the second match, a > different string, which is supposed to appear several lines after the > line of first match in a fast way? > > for example, the following is the contents of a file > > ka;sdfjaskf;asdfjk > skdfkfkfkfkfkfkfkfkfk > aks;flasjklfjkassjfksa > aaaaaaaaaaaaaaaaaaaaaaaa > bbbbbasdfdask;fjsdkalf > *************hello world***************ka;sdjkf;sjadkfj > asdfkasjdkfldjaskl;jfklas; > jaskdl;fjkasdjkfljdskla;jdfs > jkasl;jfkasjdklfjsal;df > asjkdfjkasd;fd;asdfj > ***********Ruby*********a;sjdfklsdjal;fjkda; > asdfjjasklfjkdasjkfjaskl; > fjdka;dfdjasjfsd;a > > So, after I found the match "hello world" by using a while loop, how can > i find the "Ruby" in the same while loop? It's probably easiest if you store the state of your search somewhere. state = :initial File.foreach "foo" do |line| case state when :initial if /first/ =~ line puts line state = :first_match end when :first_match if /second/ =~ line puts line state = :second_match end else # ignore end end Cheers robert -- use.inject do |as, often| as.you_can - without end