logo       

[ruby-list:42465] Re: 多量の正規表現との効率的なマッチのアイデアを、、: msg#00119

lang.ruby.japanese

Subject: [ruby-list:42465] Re: 多量の正規表現との効率的なマッチのアイデアを、、

From: しん <dezawa-eY1vtc/6GtbR7s880joybQ@xxxxxxxxxxxxxxxx>
Subject: [ruby-list:42461] Re: 多量の正規表現との効率的なマッチのアイデアを、、
Date: Fri, 23 Jun 2006 15:14:31 +0900

> myreg.each{|catreg| # このあたりが
> url =~ catreg[1] || next # もっと美しくならんか
> cat = catreg[0] # 馬鹿サーチではなく
> break # もっと効率良くならないか
> } # というのが、今回の「思い」です。

Enumerable#findを使ってみました。

Enumerable#find
--- find([ifnone]) {|item| ... }
--- detect([ifnone]) {|item| ... }

要素に対してブロックを評価した値が真になった最初の要素を返します。
真になる要素がひとつも見つからなかったときは ifnone を(もし
指定されていれば)評価して nil を返します。
(ruby 1.7 feature: ifnoneを評価した結果を返します。
)
ifnone には文字列かあるいは、call メソッドを持つオブジェ
クト(例えば Proc)を指定します。

[1,2,3].find("raise") {|v| v > 4}
# => -:1: unhandled exception

ruby 1.7 feature: ifnone に文字列は指定できなくなりました。

> $/ = nil
> input=open("myreg")
>
> myreg=input.gets.split(/\n/).map{|line|

こんなことしなくてもFile.readで一発です。
File.readlinesでもかまいません。

> count=Hash.new
> count[cat] = (count[cat]||=0)+1

Hash.new(0)で0に初期化しておきました。
そのためカウント処理は
count[cat]+=1
ですみます。

> while input.gets

同様、File.readで一気に読み込んで処理しました。

myreg = File.read("myreg").split(/\n/).map{|line|
cat,data = line.split;
[cat, Regexp.new(Regexp.quote(data))]
}

count = Hash.new(0)
File.read("testdata").split(/\n/).each do |line|
cat,url = line.split
cat_matched,_ = myreg.find{|mycat,reg| url =~ reg}
cat = cat_matched if cat_matched
count[cat] += 1
end

count.each{|k,v| print "#{k} #{v} count\n" }

--
rubikitch
http://www.rubyist.net/~rubikitch/




<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise