けいじゅ@事開事.三井造船です. 

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 <----