けいじゅ@事開事.三井造船です. In [ruby-list :00256 ] the message: "[ruby-list:256] Re: TUTORIAL(sono:1) - grep = first step ", on Mar/27 16:54(JST) matz / caelum.co.jp (Yukihiro Matsumoto) writes: >参考までに今回のチュートリアルでどの辺が分からなかったか,も >うちょっと具体的に指摘して頂けません? もう,rubyを知らない自 >分には戻れないので….^^;; はいはい. リクエストにお答えします. ># 全然説明していない関数と言うとRegexp.compileとかかなあ. > 1 $pat = ARGV.shift > 2 while gets > 3 print if /#$pat/ > 4 end > >1行目は引数からパターンを取り出して,変数$patに代入していま >す.rubyのコマンドライン引数はARGVという配列に入っていますの >で,その最初の要素を取り出しています.ARGV.shiftというのは, >配列の最初の要素を取り除く操作です. >2行目の「while gets」というのは,引数で指定されたファイルか >ら1行ずつ取り出すためのある種の決まり文句です. 引数ではなくて, ARGVに入っている文字列をファイル名としているんでしょう ね?? ARGVは配列なので, 複数あるとどうなるのか疑問に思ったりします. >3行目でパターンに合う行があれば,printしています./#$pat/と >いう表現は,読み込んで来た行と$patで表される正規表現の比較を >行うという意味です. ``#''の意味が分かりません. >4行目の「end」は2行目の「while」と対応するものです.whileに >よる繰り返しはここまでであることを示しています. >以下のプログラムが高速化したgrep1.rbです. > > 1 $pat = Regexp.compile(ARGV.shift); > 2 while gets > 3 print if $_ =~ $pat > 4 end > >1行目と2行目が代わったところです.つまり,正規表現を毎回生成 >するのをやめて(//はデフォルトでは毎回正規表現オブジェクトを >生成します),同じ正規表現を再利用するようにしました.これだ >けでずいぶん高速になります. > 1 $pat = Regexp.compile(ARGV.shift); 確かに説明がありませんね. >例として,マッチした部分を反転するgrepを作ってみましょう. > > 1 st = "\033[7m" > 2 en = "\033[m" > 3 > 4 $pat = Regexp.compile(ARGV.shift); > 5 while gets > 6 if $_ =~ $pat > 7 gsub! $pat, "#{st}&#{en}" > 8 print > 9 end > 10 end では, > 1 st = "\033[7m" > 2 en = "\033[m" の必要性と, > 7 gsub! $pat, "#{st}&#{en}" が, 何が何だか分かりません(;_; きっと, #にからんでいると思いますが... .....................................石塚 圭樹@事開事.三井造船(株)... ------------->アドレス変わりました!! e-mail: keiju / csg.mes.co.jp <----