error with regular expression inside eval block

B

Barun Singh

I'm seeing strange behavior with Ruby 1.8 when I try to evaluate a
regular expression inside an eval block.

Consider the following:

puts '1' =~ /^[\d]+$/
eval %Q{'1' =~ /^[\d]+$/}
Could someone explain why the eval statement returns an incorrect result
for the regexp match? Thanks...
 
I

Iñaki Baz Castillo

El Jueves, 29 de Enero de 2009, Barun Singh escribi=C3=B3:
I'm seeing strange behavior with Ruby 1.8 when I try to evaluate a
regular expression inside an eval block.

Consider the following:

puts '1' =3D~ /^[\d]+$/

eval %Q{'1' =3D~ /^[\d]+$/}

Could someone explain why the eval statement returns an incorrect result
for the regexp match? Thanks...

It works if you escape the \ with \\ :

eval %Q{'1' =3D~ /^[\\d]+$/}
=3D> 0

Not sure why the \ must be escaped into a block code.

=2D-=20
I=C3=B1aki Baz Castillo
 
B

Barun Singh

Iñaki Baz Castillo said:
El Jueves, 29 de Enero de 2009, Barun Singh escribió:
Could someone explain why the eval statement returns an incorrect result
for the regexp match? Thanks...

It works if you escape the \ with \\ :

eval %Q{'1' =~ /^[\\d]+$/}
=> 0

Not sure why the \ must be escaped into a block code.

Ah, thanks that worked. I wonder why extra escaping is needed just
because it's in a block...
 
B

Brian Candler

Barun said:
Iñaki Baz Castillo said:
El Jueves, 29 de Enero de 2009, Barun Singh escribió:
outputs "nil" to the screen

Could someone explain why the eval statement returns an incorrect result
for the regexp match? Thanks...

It works if you escape the \ with \\ :

eval %Q{'1' =~ /^[\\d]+$/}
=> 0

Not sure why the \ must be escaped into a block code.

Ah, thanks that worked. I wonder why extra escaping is needed just
because it's in a block...

It's not in a block, it's just inside a string. There are two types of
string quoting, normally given using double-quotes and single-quotes,
and they behave differently with regards to escaping. The double-quote
variety converts special sequences like \n to newline, and \d just
becomes d.

irb(main):001:0> puts %Q{'1' =~ /^[\d]+$/}
'1' =~ /^[d]+$/
=> nil

irb(main):002:0> puts %q{'1' =~ /^[\d]+$/}
'1' =~ /^[\d]+$/
=> nil

irb(main):003:0> puts %Q{\n}

=> nil
irb(main):004:0> puts %q{\n}
\n
=> nil
 
R

Robert Klemme

2009/1/29 Barun Singh said:
I=F1aki Baz Castillo said:
El Jueves, 29 de Enero de 2009, Barun Singh escribi=F3:
outputs "nil" to the screen

Could someone explain why the eval statement returns an incorrect resul= t
for the regexp match? Thanks...

It works if you escape the \ with \\ :

eval %Q{'1' =3D~ /^[\\d]+$/}
=3D> 0

Not sure why the \ must be escaped into a block code.

Ah, thanks that worked. I wonder why extra escaping is needed just
because it's in a block...

It's not a block - it's a doubly quoted string!

Ruby version 1.8.7
irb(main):001:0> %Q{foo}
=3D> "foo"
irb(main):002:0> %Q{foo}.class
=3D> String
irb(main):003:0> %Q{foo\\no}
=3D> "foo\\no"
irb(main):004:0> %Q{foo\no}
=3D> "foo\no"
irb(main):005:0> puts %Q{foo\no}
foo
o
=3D> nil
irb(main):006:0> puts %Q{foo\\no}
foo\no
=3D> nil

Kind regards

robert


--=20
remember.guy do |as, often| as.you_can - without end
 

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

Staff online

Members online

Forum statistics

Threads
473,769
Messages
2,569,577
Members
45,052
Latest member
LucyCarper

Latest Threads

Top