#blognavi
#blognavi
囲碁ROBOT、地の計算についてのトラブル 解決のための、Rubyを使ってみる、その1の続き。
正規表現自体、私全然使えないんですよねぇ。使う時には毎回検索^^; 覚えてしまえば簡単なんでしょうけど。正規表現⇔日本語翻訳ソフトとかないもんかね?プレビュー付きHTMLエディタみたいな感じで。多分VectorのGrep関連ソフトの中にはそういう機能の付いたソフトありそうだけど、ぱっと探したけれどない。気が向いたら作ろうかしらん。
えーと、本題にもどります^^ 正規表現を極める!!を参考に、
- //の間の正規表現に一致する行を表示(ここでは'1'という文字列)
while line=gets if /1/ =~ line print line end end
で、問題なし。第一章の最後に、
while gets if /1/ print end end
でもいけると書いてありますが、うちの環境(Ruby1.8.4)では、Syntax Error (文法エラー)はでないものの、プログラム終了後
warning: regex literal in condition
と注意が。ということで、正規表現をのぞく完成形は、以下のとおり。
for i in 0..2 do filename=ARGV[i] file=open(filename) file.each {|line| if /1/ =~ line p filename # 改行付き表示。 end } file.close end
2006年09月26日/囲碁ROBOT、地の計算についてのトラブル で挙げた例での、"RE[B+74.5]"と最終スコア"final_score: B+42.5"の数値部分を比較したいわけです。「数字 .(小数点) 5」という文字列は、前の二つをのぞけばコミの設定だけで、記録順もコミが最初という規則性があります。ということは、
/...\.5/ =~ line
という条件にマッチする2番目と3番目が一致するかどうかを調べればいいことになります。
注意:小数点(.)は正規表現におけるメタ文字で、これ自体を正規表現の中に使う場合には、エスケープシーケンス「\」を使います。「.」は任意の一文字。
で、n番目の要素は $~[n] と表すらしいので、正規表現部分は、
/...\.5/ =~ line if $~[1] != $~[2] p filename end
でいいのではないかしらん?と思ったら、
undefined method `[]' for nil:NilClass (NoMethodError)
というエラー。if が抜けてました^^; 時間的にかなりはまってしまった。。。
ということで、完成形は次の通り。for文の繰り返しを10000にしておきました(大丈夫かな?^^;)
for i in 0..10000 do filename=ARGV[i] file=open(filename) value = [0, 0, 0] file.each {|line| if /...\.5/ =~ line if $~[0] != nil # 正規表現がマッチすれば if value[0] == 0 value[0]=$~[0] elsif value[1] == 0 value[1]=$~[0] else value[2]=$~[0] end end end } # 中断対局を省く (value[2] != 0) # 結果とスコアが一致しない (value[1] != value[2]) if value[2] != 0 && value[1] != value[2] p filename end file.close end
うまく動けばいいけど。とりあえずエラーを出してみる。
- ファイルがないとき、
$ ruby test.rb *.sgf > test.txt test.rb:3:in `initialize': Invalid argument - *.sgf (Errno::EINVAL) from test.rb:3 from test.rb:1
- for文の繰り返し回数が実際のファイル数以上のとき、
$ ruby test.rb *.sgf > test.txt test.rb:3:in `open': can't convert nil into String (TypeError) from test.rb:3 from test.rb:1
まぁ、こっちのエラーは出ても、test.txtに結果が出力されてるので、問題なし。で、実験。。。予想外のエラー出ました。
$ ruby test.rb *.sgf > test.txt sh: /c/Ruby184/bin/ruby: Invalid argument
なんで、shシェルのエラーが出るの?ファイル数が多すぎるということか?ということで今日はここまで。ちなみにRubyにはインクリメント演算子はないらしい。
リンク
2003年の段階で、
サーチエンジンで探してみると案外Rubyの初心者向けサイトが少ない(ように思う。)
とサイトオーナーはおっしゃってますが、確かにいまだにそうかも。(私がかじった)JavaやC++のサイトに比べりゃという話ですが。比較対象が悪いかな^^
- 逆引きRuby
- Ruby Reference
- Ruby Reference (ローカルスコープ)
- 配列操作の比較表: Ruby, Python, JavaScript, Perl, C++
- Ruby入門
カテゴリ: [ruby] - &trackback() - 2006年09月28日 21:28:03
#blognavi