[ruby-list:257] Re: TUTORIAL(sono:1) - grep = first step
From:
Date:
1996-03-27 08:21:57 UTC
List:
ruby-list #257
けいじゅ@事開事.三井造船です.
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 <----