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?