Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > behavior of substitutions with sub

Reply
Thread Tools

behavior of substitutions with sub

 
 
Robert Klemme
Guest
Posts: n/a
 
      11-04-2006
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
 
Reply With Quote
 
 
 
 
Tammo Tjarks
Guest
Posts: n/a
 
      11-04-2006
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

 
Reply With Quote
 
 
 
 
Tammo Tjarks
Guest
Posts: n/a
 
      11-05-2006
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


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Death To Sub-Sub-Sub-Directories! Lawrence D'Oliveiro Java 92 05-20-2011 06:50 AM
Recognising Sub-Items and sub-sub items using xslt Ben XML 2 09-19-2007 09:35 AM
using templates as substitutions for #ifdef Chris Goller C++ 4 03-09-2005 12:17 AM
Ant problem with property substitutions. RJGraham Java 6 06-28-2004 03:49 AM
Tkinter: spinbox command and percent substitutions Tony Eva Python 1 11-09-2003 02:25 PM



Advertisments