[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

strange difference between irb and ruby

naPOLeon

7/30/2006 7:03:00 PM

Hello,
I'm a just beginner to ruby and impressed by the possibility to test
code in irb. Today I wrote a line of code in irb and it behaved as I
expected. But when I inserted it in my program and executed with ruby,
the code-block didn't worke. Maybe you could tell me why.

The line

a.scan(reg_exp).each {|w| print "#{w.to_s}: "; a.sub!(reg_exp,
gets.chomp)}

It asked me in irb depending on the size of 'a' for some input and
replaced a part (I used the Regular Expression /<\w*>/) of the string
'a' with my input.
But if I use this line in a program, the part 'gets.chomp' seems to be
ignored. The result is no change on String 'a'.

I've no explanation for this strange behaviour, I hope you can give me
a hint. Maybe the whole line is rubbish and there is a lot better way
to do the job?

Thanks,
naPOLeon

3 Answers

William James

7/30/2006 10:05:00 PM

0

naPOLeon wrote:
> Hello,
> I'm a just beginner to ruby and impressed by the possibility to test
> code in irb. Today I wrote a line of code in irb and it behaved as I
> expected. But when I inserted it in my program and executed with ruby,
> the code-block didn't worke. Maybe you could tell me why.
>
> The line
>
> a.scan(reg_exp).each {|w| print "#{w.to_s}: "

w is already a string.

> ; a.sub!(reg_exp,
> gets.chomp)}

To me, it doesn't make sense to change the string
while you are scanning it.

Try this:

a = "foo <trew> bar <tich>"
reg_exp = /<\w*>/
a.gsub!(reg_exp) { |w| print "#{w}: "; gets.chomp }

p a


>
> It asked me in irb depending on the size of 'a' for some input and
> replaced a part (I used the Regular Expression /<\w*>/) of the string
> 'a' with my input.
> But if I use this line in a program, the part 'gets.chomp' seems to be
> ignored. The result is no change on String 'a'.
>
> I've no explanation for this strange behaviour, I hope you can give me
> a hint. Maybe the whole line is rubbish and there is a lot better way
> to do the job?
>
> Thanks,
> naPOLeon

Stefan Lang

7/30/2006 10:11:00 PM

0

On Sunday 30 July 2006 21:05, naPOLeon wrote:
> Hello,
> I'm a just beginner to ruby and impressed by the possibility to
> test code in irb. Today I wrote a line of code in irb and it
> behaved as I expected. But when I inserted it in my program and
> executed with ruby, the code-block didn't worke. Maybe you could
> tell me why.
>
> The line
>
> a.scan(reg_exp).each {|w| print "#{w.to_s}: "; a.sub!(reg_exp,
> gets.chomp)}
>
> It asked me in irb depending on the size of 'a' for some input and
> replaced a part (I used the Regular Expression /<\w*>/) of the
> string 'a' with my input.
> But if I use this line in a program, the part 'gets.chomp' seems to
> be ignored. The result is no change on String 'a'.

I don't know if this is the problem here, but:
"gets" might not do exactly what you think it does...
Try changing it to "$stdin.gets".

Read:
$ ri Kernel#gets
That's what you use now...
and:
$ ri IO#gets
That's what you call with $stdin.gets.

HTH,
Stefan

naPOLeon

7/31/2006 1:01:00 PM

0

Thanks William and Stefan,

your right, gsub! is a better way to do what I want. But your solution
doesn't work, either. I think ruby has a problem by invoking gets.chomp
(by the way Stefan, it made for me no difference to use $stdin.gets
instead of gets )-: in a block. I hope you know a workaround (I tried
to write ..do..end instead of {}, but it doesn't changed anything in
the behaviour of my program)

thanks,
naPOLeon

William James wrote:
> naPOLeon wrote:
> > Hello,
> > I'm a just beginner to ruby and impressed by the possibility to test
> > code in irb. Today I wrote a line of code in irb and it behaved as I
> > expected. But when I inserted it in my program and executed with ruby,
> > the code-block didn't worke. Maybe you could tell me why.
> >
> > The line
> >
> > a.scan(reg_exp).each {|w| print "#{w.to_s}: "
>
> w is already a string.
>
> > ; a.sub!(reg_exp,
> > gets.chomp)}
>
> To me, it doesn't make sense to change the string
> while you are scanning it.
>
> Try this:
>
> a = "foo <trew> bar <tich>"
> reg_exp = /<\w*>/
> a.gsub!(reg_exp) { |w| print "#{w}: "; gets.chomp }
>
> p a
>
>
> >
> > It asked me in irb depending on the size of 'a' for some input and
> > replaced a part (I used the Regular Expression /<\w*>/) of the string
> > 'a' with my input.
> > But if I use this line in a program, the part 'gets.chomp' seems to be
> > ignored. The result is no change on String 'a'.
> >
> > I've no explanation for this strange behaviour, I hope you can give me
> > a hint. Maybe the whole line is rubbish and there is a lot better way
> > to do the job?
> >
> > Thanks,
> > naPOLeon