[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

understanding aRegexp === aString

pere.noel

3/23/2006 2:12:00 PM

i'm experiencing with regexp and ruby and follo the page
<http://www.rubycentral.com/book/ref_c_regex...

at "===" i've found an example :

a = "HELLO"
case a
when /^a-z*$/; print "Lower case\n"
when /^A-Z*$/; print "Upper case\n"
else; print "Mixed case\n"
end

saying it produces :
# => Upper case

i got :

Mixed case

why this discrapency, if any ???

is that due to the fact my script file is UTF-8 encoded ???

also with :
truc = 'toto'
rgx=Regexp.new('^toto$')
flag=(truc =~ rgx)? true : false
p "flag = #{flag}"
# => "flag = true"
flag=(truc === rgx) /// this one i don't understand the result
p "flag = #{flag}"
# => "flag = false"
flag=(truc == rgx)
p "flag = #{flag}"
# => "flag = false"
flag=(truc =~ rgx)
p "flag = #{flag}"
# => "flag = 0"

why, when aString = 'toto' and ARegexp = Regexp.new('^toto$')

the equality "===" returns false ???

--
une bévue
10 Answers

Ross Bamford

3/23/2006 2:37:00 PM

0

On Thu, 2006-03-23 at 23:13 +0900, Une bévue wrote:
> i'm experiencing with regexp and ruby and follo the page
> <http://www.rubycentral.com/book/ref_c_regex...
>
> at "===" i've found an example :
>
> a = "HELLO"
> case a
> when /^a-z*$/; print "Lower case\n"
> when /^A-Z*$/; print "Upper case\n"
> else; print "Mixed case\n"
> end
>
> saying it produces :
> # => Upper case
>
> i got :
>
> Mixed case
>
> why this discrapency, if any ???
>

I guess that's a typo on the site, it's correct in my printed 2nd ed:

a = "HELLO"
case a
when /^[a-z]*$/; print "Lower case\n"
when /^[A-Z]*$/; print "Upper case\n"
else; print "Mixed case\n"
end

# -> Upper Case

(Notice the [] brackets that denote a character set)

> also with :
> truc = 'toto'
> rgx=Regexp.new('^toto$')
> flag=(truc =~ rgx)? true : false
> p "flag = #{flag}"
> # => "flag = true"
> flag=(truc === rgx) /// this one i don't understand the result
> p "flag = #{flag}"
> # => "flag = false"
> flag=(truc == rgx)
> p "flag = #{flag}"
> # => "flag = false"
> flag=(truc =~ rgx)
> p "flag = #{flag}"
> # => "flag = 0"
>
> why, when aString = 'toto' and ARegexp = Regexp.new('^toto$')
>
> the equality "===" returns false ???
>

Try this:

truc = 'toto'
rgx=Regexp.new('^toto$')
flag=(truc =~ rgx)? true : false
p "flag = #{flag}"
# => "flag = true"
flag=(rgx === truc) # /// switch these around
p "flag = #{flag}"
# => "flag = true"
flag=(truc == rgx)
p "flag = #{flag}"
# # => "flag = false"
flag=(truc =~ rgx)
p "flag = #{flag}"
# # => "flag = 0"

See also the 'what on earth...' thread that's been on the list recently
(yesterday/today I think).

--
Ross Bamford - rosco@roscopeco.REMOVE.co.uk



Robert Klemme

3/23/2006 2:46:00 PM

0

Ross Bamford wrote:
> On Thu, 2006-03-23 at 23:13 +0900, Une bévue wrote:

>> the equality "===" returns false ???

Adding to Ross' excellent explanation: it helps to *not* view "===" as
an equality operator. Rather it's a general matching operator, whatever
matching means in a certain context. For RX it will do an RX match, for
class objects it will do the kind_of? check, for a range it will check
include? etc. Btw, has anyone an idea why this does not apply to
Enumerable?

>> [1,2,3].include? 2
=> true
>> [1,2,3] === 2
=> false

Kind regards

robert

pere.noel

3/23/2006 2:48:00 PM

0

Ross Bamford <rossrt@roscopeco.co.uk> wrote:

> (Notice the [] brackets that denote a character set)

fine, thanks, difficult to catch out typos particularly in regexps...

>
>
> Try this:
>
[...]

> flag=(rgx === truc) # /// switch these around
> p "flag = #{flag}"
> # => "flag = true"

i did both :
flag=(truc === rgx)
p "flag = #{flag} for flag=(truc === rgx)"
# => "flag = false for flag=(truc === rgx)""
flag=(rgx === truc)
p "flag = #{flag} for flag=(rgx === truc)"
# => "flag = true for flag=(rgx === truc)"

that's a really strange behaviour, to me, of ruby, a "symetrical"
operator symbol being not commutative ????

better to know ;-)

>
> See also the 'what on earth...' thread that's been on the list recently
> (yesterday/today I think).

ok, thanks very much !
--
une bévue

Joel VanderWerf

3/23/2006 5:28:00 PM

0

Robert Klemme wrote:
> Ross Bamford wrote:
>> On Thu, 2006-03-23 at 23:13 +0900, Une bévue wrote:
>
>>> the equality "===" returns false ???
>
> Adding to Ross' excellent explanation: it helps to *not* view "===" as
> an equality operator. Rather it's a general matching operator, whatever
> matching means in a certain context. For RX it will do an RX match, for
> class objects it will do the kind_of? check, for a range it will check
> include? etc. Btw, has anyone an idea why this does not apply to
> Enumerable?
>
>>> [1,2,3].include? 2
> => true
>>> [1,2,3] === 2
> => false

It would be nice, but then how would this work:

irb(main):001:0> case [1,2,3]
irb(main):002:1> when [1,2,3]
irb(main):003:1> puts "same array!"
irb(main):004:1> end
same array!
=> nil

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407


Joel VanderWerf

3/23/2006 5:42:00 PM

0

Robert Klemme wrote:
> Ross Bamford wrote:
>> On Thu, 2006-03-23 at 23:13 +0900, Une bévue wrote:
>
>>> the equality "===" returns false ???
>
> Adding to Ross' excellent explanation: it helps to *not* view "===" as
> an equality operator. Rather it's a general matching operator, whatever
> matching means in a certain context. For RX it will do an RX match, for
> class objects it will do the kind_of? check, for a range it will check
> include? etc. Btw, has anyone an idea why this does not apply to
> Enumerable?
>
>>> [1,2,3].include? 2
> => true
>>> [1,2,3] === 2
> => false

It would be nice, but then how would this work:

irb(main):001:0> case [1,2,3]
irb(main):002:1> when [1,2,3]
irb(main):003:1> puts "same array!"
irb(main):004:1> end
same array!
=> nil

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407


Stephen Bannasch

3/23/2006 10:06:00 PM

0

I'm trying to use builder to construct jnlp files. I need to create
elements with "-" in the name and can't. For example I need to output
the following xml fragment:

<security>
<all-permissions />
</security>

Here's what I tried with builder:

x = Builder::XmlMarkup.new(:target => $stdout, :indent => 1)

x.security {
x.all-permissions
}

but the "-" is parsed in the name and this produces a NameError

NameError: undefined local variable or method `permissions' for main:Object

Is there a way to do this?
--
- Stephen Bannasch
Concord Consortium, http://www.c...


YANAGAWA Kazuhisa

3/23/2006 11:18:00 PM

0

In Message-Id: <48fqlkFjiogvU1@individual.net>
Robert Klemme <bob.news@gmx.net> writes:

> >> [1,2,3].include? 2
> => true
> >> [1,2,3] === 2
> => false

Once that can be but "fixed" later since.... it can be a seed of
confusion and we can use "*" for array on when clause.

n = 2
array = [2, 4, 6]

case n
when *array
puts "foo"
else
puts "bar"
end

# prints "foo"


--
kjana@dm4lab.to March 24, 2006
Whatever is worth doing at all is worth doing well.



Josh Knowles

3/23/2006 11:23:00 PM

0

On 3/23/06, Stephen Bannasch <stephen.bannasch@gmail.com> wrote:
>
> ...
>
> x.security {
> x.all-permissions
> }
>
> but the "-" is parsed in the name and this produces a NameError
>
> NameError: undefined local variable or method `permissions' for
> main:Object
>
> Is there a way to do this?



Use the tag! method...

x.security {
x.tag! "all-permissions" {

}
}

Hope this helps.

Josh

Stephen Bannasch

3/24/2006 2:54:00 AM

0

Thanks Josh. That did indeed help! It is much simpler than the way I was trying to solve the problem.

>Use the tag! method...
>
>x.security {
> x.tag! "all-permissions" {
>
> }
>}

--
- Stephen Bannasch
Concord Consortium, http://www.c...


Robert Klemme

3/24/2006 9:38:00 AM

0

YANAGAWA Kazuhisa wrote:
> In Message-Id: <48fqlkFjiogvU1@individual.net>
> Robert Klemme <bob.news@gmx.net> writes:
>
>> >> [1,2,3].include? 2
>> => true
>> >> [1,2,3] === 2
>> => false
>
> Once that can be but "fixed" later since.... it can be a seed of
> confusion and we can use "*" for array on when clause.
>
> n = 2
> array = [2, 4, 6]
>
> case n
> when *array
> puts "foo"
> else
> puts "bar"
> end
>
> # prints "foo"

Good point! Thanks to you and Joel!

Kind regards

robert