|
[ruby-list:42465] Re: 多量の正規表現との効率的なマッチのアイデアを、、: msg#00119lang.ruby.japanese
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> |
|---|---|---|
| Previous by Date: | [ruby-list:42464] Re: 多量の正規表現との効率的なマッチのアイデアを、、, しん |
|---|---|
| Next by Date: | [ruby-list:42466] Affordable medicine directly fr0m manufacturer, Lucy |
| Previous by Thread: | [ruby-list:42464] Re: 多量の正規表現との効率的なマッチのアイデアを、、, しん |
| Next by Thread: | [ruby-list:42467] Re: 多量の正規表現との効率的なマッチのアイデアを、、, しん |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |