Bug #6723
closedGlobal variable scoping problem.
Description
This issue exists from 1.8 to ruby-head.
See the following example:
def foobar
"Foobar".match(/^(\w*)/)
puts $1.inspect
end
foobar
puts $1.inspect
puts global_variables.inspect
This demonstrates that $1 does not behave like a global variable. However it's listed by Kernel.global_variables as a global variable. And it's named like a global variable.
This leads to some confusion sometimes. See for example http://stackoverflow.com/q/11441782/773690
It may not be a good idea to fix this inconsistent naming, because it may break severaly things. However the fact that $1 and friends are not global variables should be clearly documented. And by the way: Ruby != Perl.
Or maybe make $1 a real global variable?
Updated by ko1 (Koichi Sasada) over 12 years ago
- Target version set to 2.0.0
- Category set to core
- Assignee set to matz (Yukihiro Matsumoto)
Updated by nobu (Nobuyoshi Nakada) over 12 years ago
- Category changed from core to doc
- Status changed from Open to Assigned
- Assignee changed from matz (Yukihiro Matsumoto) to drbrain (Eric Hodel)
- ruby -v changed from ruby 1.9.3p194 to -
Updated by drbrain (Eric Hodel) over 12 years ago
- Status changed from Assigned to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r36526.
Markus, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
- re.c (rb_reg_s_last_match): Update $~ to reference Regexp
documentation about "special global variables". [Bug #6723]
Updated by drbrain (Eric Hodel) over 12 years ago
These are described as "Special global variables" and are described as "thread-local and method-local" in the Regexp documentation. I updated a reference to them in re.c, but the existing documentation should be sufficient.