# Behavior of substitutions with sub

**URL:** <https://www.ruby-forum.com/t/behavior-of-substitutions-with-sub/74912>\
**Category:** Ruby\
**Created:** [November 7, 2006, 11:01am UTC](https://www.ruby-forum.com/t/behavior-of-substitutions-with-sub/74912 "2006-11-07T11:01:19Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tammo\_T](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/ea5d25/32.png) [@Tammo\_T](https://www.ruby-forum.com/u/Tammo_T)\
**Post date:** [November 7, 2006, 11:01am UTC](https://www.ruby-forum.com/t/behavior-of-substitutions-with-sub/74912/1 "2006-11-07T11:01:19Z")

</div>

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(//,"") 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

---

<div class="post-metadata">

**Author:** ![Tammo\_T](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/ea5d25/32.png) [@Tammo\_T](https://www.ruby-forum.com/u/Tammo_T)\
**Post date:** [November 7, 2006, 11:01am UTC](https://www.ruby-forum.com/t/behavior-of-substitutions-with-sub/74912/2 "2006-11-07T11:01:25Z")

</div>

Tammo T. wrote:

> irb(main):012:0\> tst = “Das war ja nix”  
> =\> “Das war ja n”  
> 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
```

---

<div class="post-metadata">

**Author:** ![Tammo\_T](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/ea5d25/32.png) [@Tammo\_T](https://www.ruby-forum.com/u/Tammo_T)\
**Post date:** [November 7, 2006, 11:04am UTC](https://www.ruby-forum.com/t/behavior-of-substitutions-with-sub/74912/3 "2006-11-07T11:04:04Z")

</div>

Thanks for you answer. That makes sense.

Regards,  
Tammo
