Hugh Sasse Staff Elec Eng <hgs / dmu.ac.uk> writes: > On 12 Jun 2000, Dave Thomas wrote: > > > > > How about making any assignment to one of these globals-with-a- > > side-effect generate a warning if -w was in effect. That way you'd at > > least know that it was happening. > > Would it be possible to have a test for "when calling this code, it > is possible to exit leaving a global variable changed"?. There are > only so many wasy to leave a method, module... without completely > crashing. Well, you _could_ implement Perl's 'local' facility for Ruby globals: def local(*syms) save = {} syms.each { |aSym| save[aSym] = (eval "#{aSym}") } begin yield ensure save.each { |aSym, aVal| eval "#{aSym} = aVal" } end end You'd call this with local (<list of globals to save>) { code that modifies them } <values restored here> For example: $; = "hello" $/ = "goodbye" $, = ", " local(:$;, :$/, :$,) { $; = 'hi'; $/ = nil $, = " - " print $;, $/, "\n" #=> hi - nil - } print $;, $/, "\n" #=> hello, goodbye, This is pretty tacky code - the 'local' method should check that it is only passed true globals, and should reject $_ and $!. That's left as an exercise to the reader (as we say) ;-) Dave