From: Brendan Baldwin Date: 2006-07-20T00:16:51+09:00 Subject: Re: How to preserve $~ when extending Regexp#match Mauricio -- The block implentation is pretty cool -- My problem is I was trying to modify Regexp#match for use with a production application at my current employer, which also uses the REXML library, that unfortunately uses $~ vars all over and doesn't use blocks to get at them, so it breaks. And I'm constrained in not using set_trace_func here, so that's unfortunatlely out of the picture too. *Sigh* Darn little esoteric PERLy $~ !! Oh well. Spent more time than I should have on this already... Perhaps Ruby 1.9 or 2.0 will give us caller bindings for free some day. --Brendan Mauricio Fernandez wrote: > On Wed, Jul 19, 2006 at 07:13:10AM +0900, Brendan Baldwin wrote: >> end >> $~ # <= nil >> >> Is anyone out there aware of any way to set $~ in the "caller's" binding >> from within Regexp#match *without* requiring a manual call_stack to be >> implemented via set_trace_func? > > hmm the only general way I'm aware of does use Binding.of_caller (and > therefore set_trace_func), see for instance [150292]. However, if your > method > took a block, it'd be easily doable. > > Silly example: > > class Regexp > alias_method :_original_match, :match > def match(*str, &block) > if block_given? > md = _original_match(yield) > eval("lambda{|x| $~ = x}", block).call($~) > else > md = _original_match(*str) > end > md.regexp = self if md > md > end > end > > class MatchData > attr_accessor :regexp > end > > /myregexp/.match{"test myregexp"} > # note the syntax change; you might find this unacceptable :-| > $~ # => # > $~.regexp # => /myregexp/ > $~.pre_match # => "test " > > > Sorry if this doesn't really help. -- Posted via http://www.ruby-forum.com/.