[#42454] 多量の正規表現との効率的なマッチのアイデアを、、 — しん <dezawa@...>

出沢です

22 messages 2006/06/22
[#42455] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — rubikitch <rubikitch@...> 2006/06/22

From: しん <dezawa@aliadne.net>

[#42456] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — しん <dezawa@...> 2006/06/23

出沢です

[#42458] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — rubikitch <rubikitch@...> 2006/06/23

From: しん <dezawa@aliadne.net>

[#42459] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — しん <dezawa@...> 2006/06/23

出沢です

[#42460] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — rubikitch <rubikitch@...> 2006/06/23

From: しん <dezawa@aliadne.net>

[#42461] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — しん <dezawa@...> 2006/06/23

出沢です。

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

From: rubikitch <rubikitch@...>
Date: 2006-06-23 06:55:46 UTC
List: ruby-list #42465
From: しん <dezawa@aliadne.net>
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/

In This Thread