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 :-|
> $~                                 # => #<MatchData:0xa7d26fd4>
> $~.regexp                          # => /myregexp/
> $~.pre_match                       # => "test "
> 
> 
> Sorry if this doesn't really help.


-- 
Posted via http://www.ruby-forum.com/.