From: shugo@... (Shugo Maeda) Date: 1998-02-15T12:25:05+09:00 Subject: [ruby-list:6417] rgrep (Re: call for scripts) --Multipart_Sun_Feb_15_12:22:26_1998-1 Content-Type: text/plain; charset=ISO-2022-JP 前田です。 In message "[ruby-list:6416] Re: call for scripts" Shugo Maeda wrote: |[2 rgrep ] すみません、終了ステータスのことを忘れていたので、 手直ししました。 # 安直にexit($? >> 8)でよいのでしょうか。 他にも修正したらdiffの方が大きくなってしまったので、 再度スクリプト全体を添付します。 --Multipart_Sun_Feb_15_12:22:26_1998-1 Content-Type: application/octet-stream Content-Disposition: attachment; filename="rgrep" Content-Transfer-Encoding: 7bit #!/usr/local/bin/ruby GREP_CMD = 'grep' GREP_ARGS = [] def foreach_files(path) if FileTest.directory?(path) if path[-1] != ?/ path = path + '/' end Dir.foreach(path) do |file| if file != '.' and file != '..' foreach_files(path + file) do |file| yield(file) end end end else yield(path) end end while arg = ARGV.shift and arg[0] == ?- GREP_ARGS.push(arg) if /^-[ABef]/ =~ arg # option requires an argument optarg = ARGV.shift unless optarg system(GREP_CMD, arg) # print error message exit($? >> 8) end GREP_ARGS.push(optarg) end end GREP_ARGS.push(arg) if arg # expr for path in ARGV foreach_files(path) do |file| GREP_ARGS.push(file) end end system(GREP_CMD, *GREP_ARGS) exit($? >> 8) --Multipart_Sun_Feb_15_12:22:26_1998-1 Content-Type: text/plain; charset=ISO-2022-JP 再帰的なイテレータを定義する時、 def foreach_files(path) ... foreach_files(...) do |path| yield(path) end ... end みたいにしないといけないですが、 def foreach_files(path) ... foreach_files(...) ... end のようにすると与えられたイテレータブロックをそのまま 引き渡す、というようにはできないでしょうか。 # Proc.newはそういう感じですよね。 と思ったのですが、イテレータブロックが与えられたかどうか で動作が違うメソッドもあるので困りますね。 似たような話が前にあったと思うのですが、うまい解決法は ないでしょうか。 -- 前田 修吾 --Multipart_Sun_Feb_15_12:22:26_1998-1--