From: Karl von Laudermann Date: 2006-08-08T22:30:07+09:00 Subject: Re: value of $1is retained Anders Vesterberg wrote: > Hi > I am using regexp in a loop to extract a value from a > string. I have noticed that when string is nil $1 keeps its > old value, which means that the expression after regexp > does not get the correct value (which should be nil). The > code looks like this > > (0..key_colnames.length-1).each do |i| > person_data[key_colnames[i]] =~ /\"?([\w\-: ]*)\"?/ > # assigning $1 to something > end > > Shouldn't the $-variables be reset after each regexp? Or is > it a better way to do this? I know this doesn't answer your question as to why it works that way, but you could instead write: (0..key_colnames.length-1).each do |i| if person_data[key_colnames[i]] =~ /\"?([\w\-: ]*)\"?/ # assigning $1 to something end end or even: (0..key_colnames.length-1).each do |i| myvar = (person_data[key_colnames[i]] =~ /\"?([\w\-: ]*)\"?/) ? $1 : nil end Incidentally, what version of Ruby are you using? I was unable to reproduce this behavior on Ruby 1.8.4 on Windows. This sample program: "boom" =~ /(o)/ puts "$1 = #{$1.inspect}" "boom" =~ /(a)/ puts "$1 = #{$1.inspect}" "boom" =~ /(o)/ puts "$1 = #{$1.inspect}" yields this output: $1 = "o" $1 = nil $1 = "o"