Robert Klemme
6/26/2008 12:44:00 PM
2008/6/25 Cheyne Li <happy.go.lucky.clr@gmail.com>:
> 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