Error with regular expression inside eval block

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...

···

--
Posted via http://www.ruby-forum.com/.

It works if you escape the \ with \\ :

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

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

···

El Jueves, 29 de Enero de 2009, Barun Singh escribió:

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...

--
Iñaki Baz Castillo

Iñaki Baz Castillo wrote:

···

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...
--
Posted via http://www.ruby-forum.com/\.

Barun Singh wrote:

Iñaki Baz Castillo wrote:

>> 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

···

El Jueves, 29 de Enero de 2009, Barun Singh escribió:

--
Posted via http://www.ruby-forum.com/\.

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

···

2009/1/29 Barun Singh <barunio@gmail.com>:

Iñaki Baz Castillo wrote:

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...

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