Karl von Laudermann
8/8/2006 1:27:00 PM
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"