From: Robert Klemme Date: 2008-07-30T16:33:10+09:00 Subject: Re: A couple of basic questions 2008/7/30 RichardOnRails : > Hi, > > Q.1: I was processing file/dir names with the following snippet: > > Find.find(wd) do |item| # Subordinate file/directory fully-qualified > names > if File.directory?(item) > # Process directory name > if item =~ /portfolio/i > item_saved = ' ' + item > item.gsub!(/portfolio/, 'position') > > When I saved item in item_saved without modification, the gsub change > both the item name as well as the saved name (because what was saved > was a reference to item, not item's content). So my work-around was > to save a modified name. That doesn't seem like "The Ruby Way". > What's a better way? Leave item alone and store the new name in a new variable: if ... new_item = item.gsub(/portfolio/, 'position') (notice the missing "!") > Q. 2: In that same snippet, I made two substitutions: > > item.gsub!(/portfolio/, 'position') > item.gsub!(/Portfolio/, 'Position') > > That's also a kluge. But the following didn't compile: > > item.gsub!(/([pP])ortfolio/, $1 + 'osition') This cannot work because $1 is evaluated only once, i.e. before #gsub is invoked. You need something like Phlip suggested. item.gsub /([pP])ortfolio/, '\\1osition' > Is there a "Ruby Way" to reduce the redundancy? Yes. Cheers robert -- use.inject do |as, often| as.you_can - without end