Thanks for you answer. That makes sense. Regards, Tammo Robert Klemme wrote: > Tammo Tjarks wrote: >> Hello, >> I have seen a somehow strange behavior with Strings and the sub-method. >> Maybe you cen give me an idea if it is a bug and where it comes from. >> It have seen the problem when I wanted to make an substition with a >> sub(/<regexp>/,"") instead of (/<regexp/,''). >> >> To get the idea a example in irb. I tried it also with version 1.8.5 but >> have seen it first with 1.8.4: >> >> ==================================================== >> irb(main):012:0> tst = "Das war ja nix" >> => "Das war ja nix" >> irb(main):013:0> tst2 =tst >> => "Das war ja nix" >> irb(main):014:0> tst2.sub(/nix/,"was") >> => "Das war ja was" >> irb(main):015:0> tst2.sub(/(n)+ix/,"$1") >> => "Das war ja $1" >> irb(main):016:0> tst2.sub(/(n)+ix/,"#{$1}") >> => "Das war ja n" >> irb(main):017:0> tst2.sub(/(n)+(i)+(x)+/,"#{$3}#{$2}#{$1}") >> => "Das war ja n" >> irb(main):018:0> tst2.sub(/(n)+(i)+(x)+/,'\3\2\1') >> => "Das war ja xin" >> irb(main):019:0> tst2.sub(/(n)+(i)+(x)+/,"#{$3}#{$2}#{$1}") >> => "Das war ja xin" >> >> ================================================================== >> >> What I do not understand is, that the substitution in the ''-expression >> with \1, \2 and \3 work without trouble but when I use the normal >> ""-String and the #{$1}, #{$2} and #{$3}-notation he seems alway to refer >> to the last regular expression and not the one in sub-method. > > That's easily explained: the string you hand off to sub is interpreted > before the call happens. But the grouping variables are only set after > that, i.e. when sub executes. > > The version with \1 etc. works, because method sub does the > interpretation of the string and replaces \1 with contents of the first > group etc: > > irb(main):005:0> puts( "\\1" ) > \1 > => nil > irb(main):006:0> puts( "#{$1}" ) > > => nil > >> It is only an example. In the script I have seen it I cicrcumvent the >> problem by adding an extra regular expression before without using the >> result. But I think it is a strange behavior. > > Not at all once you understand how this works. It is the general > mechanism of method arguments being evaluated before the method call > starts. It's basically the same as: > > irb(main):001:0> def foo(x) puts x end > => nil > irb(main):002:0> foo( 1 + 2 ) > 3 > => nil > > Kind regards > > robert