From: Chris Date: 2002-04-16T08:02:55+09:00 Subject: Re: need help on using Ruby to replace some SED expressions In article , Chris wrote: > #!/usr/local/bin/ruby > > class String > def eval_math! > while self =~ /(log|sin|cos|tan)\s+(\d+)/ > sub! $&, eval("Math.#{$1} #{$2}").to_s > end > re = /\(\s*[\-+]?\d+(\.\d+)?(\s*[+-\/*]\s*[\-+]?\d+(\.\d+)?)*\s*\)/ > while self =~ re > x = $& > sub! x, eval(x).to_s > end > self > end > end # Much improved version. Switched sub! with self[...] = "something" # idiom. class String def eval_math! while self =~ /(log|sin|cos|tan)\s+(\d+)/ sub! $&, eval("Math.#{$1} #{$2}").to_s end re = /\(\s*[\-+]?\d+(\.\d+)?(\s*[\-+\/*]\s*[\-+]?\d+(\.\d+)?)*\s*\)/ while self =~ re self[$&] = eval($&).to_s end self end end > ARGV.each do |filename| > file = open(filename, "r") > text = file.readlines > file.close > text.collect! do |line| > line.sub!(/^(\s*\S*)\.(\S*)/, "#{$1}$#{$2}") > line.sub!("@", "^") > line.eval_math! > end > file = open(filename, "w") > file.write(text.join) > file.close > end