Error with regular expression inside eval block


#1

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]+$/

outputs “0” to the terminal

eval %Q{‘1’ =~ /^[\d]+$/}

outputs “nil” to the screen

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


#2

Iñaki Baz C. wrote:

El Jueves, 29 de Enero de 2009, Barun S. 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…


#3

El Jueves, 29 de Enero de 2009, Barun S. 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.


#4

Barun S. wrote:

Iñaki Baz C. wrote:

El Jueves, 29 de Enero de 2009, Barun S. 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


#5

2009/1/29 Barun S. removed_email_address@domain.invalid:

=> 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}
=> “foo”
irb(main):002:0> %Q{foo}.class
=> String
irb(main):003:0> %Q{foo\no}
=> “foo\no”
irb(main):004:0> %Q{foo\no}
=> “foo\no”
irb(main):005:0> puts %Q{foo\no}
foo
o
=> nil
irb(main):006:0> puts %Q{foo\no}
foo\no
=> nil

Kind regards

robert