From: Josh Cheek Date: 2009-10-04T06:17:40+09:00 Subject: Re: On Ranges as conditions --000e0cd214fa00f91204750e6931 Content-Type: text/plain; charset=ISO-8859-1 On Sat, Oct 3, 2009 at 12:15 PM, Rafael Cunha de Almeida wrote: > Reading a few tutorials I found this piece of code: > > while input = gets > input = input.chomp > puts input + " triggered" if input =~ /start/ .. input =~ /end/ > end > > I understand what it does. If I type start, end or anything in between > it prints > "triggered" after the input. Now, if I'm out of the start .. end block, > the if > fails. > > What I don't understand is how it does it. For instance, if I use the > interpreter to do something like this: > > irb(main):038:0> input = 'fooo' > => "fooo" > irb(main):039:0> puts input + " triggered" if input =~ /start/ .. > input > =~ /end/ > => nil > irb(main):040:0> input = 'start' > => "start" > irb(main):041:0> puts input + " triggered" if input =~ /start/ .. > input > =~ /end/ > start triggered > => nil > irb(main):042:0> input = 'bar' > => "bar" > irb(main):043:0> puts input + " triggered" if input =~ /start/ .. > input > =~ /end/ > => nil > > it doesn't work as I'd expect. I thought the if clause there would > somehow set a > global to say "the first regex was matched" or something like that. But it > doesn't seem to be the way it works. It only seems to work inside of a > while > loop. I thought it might have something to do with the $_ global. But I > made a > test in the interpreter which ruled out that theory: > > irb(main):045:0> $_ = 'foo' > => "foo" > irb(main):046:0> input = 'foo' > => "foo" > irb(main):047:0> puts input + " triggered" if input =~ /start/ .. > input > =~ /end/ > => nil > irb(main):048:0> $_ = input = 'start' > => "start" > irb(main):049:0> puts input + " triggered" if input =~ /start/ .. > input > =~ /end/ > start triggered > => nil > irb(main):050:0> $_ = input = 'foo' > => "foo" > irb(main):051:0> puts input + " triggered" if input =~ /start/ .. > input > =~ /end/ > => nil > irb(main):052:0> > > Can anyone help me find out what's going on? > > # (this entire response can be directly placed into a script -- not the above quote, though) # # The first condition turns it on (causes it to evaluate to true) # the second turns it off (causes it to evaluate back to false). # In this example, you would get the output # # start triggered # instruction2 triggered # instruction3 triggered # end triggered # start triggered # instruction6 triggered # instruction7 triggered # instruction8 triggered # end triggered # # Give it a try $stdin = DATA while input = gets input = input.chomp puts input + " triggered" if input =~ /start/ .. input =~ /end/ end __END__ instruction0 instruction1 start instruction2 instruction3 end instruction4 instruction5 start instruction6 instruction7 instruction8 end instruction9 --000e0cd214fa00f91204750e6931--