From: Rafael Cunha de Almeida Date: 2009-10-04T02:15:10+09:00 Subject: On Ranges as conditions 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?