behavior of substitutions with sub

R

Robert Klemme

Tammo said:
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
 
T

Tammo Tjarks

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.
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.

Any comments about that.

Regards,
Tammo
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,020
Latest member
GenesisGai

Latest Threads

Top