Yes, because (as with Perl) there are two forms of conditional range:
".." and "...".

The three dots form evaluate the condition after the code. Therefore,
the "four" is printed, then the condition is evaluated to false.

The two dots form evaluates the condition before the code. So it
should works as you expect : "($_ =~ /^## two/)..($_ =~ /^## four/)".

On 5 juin, 02:51, "Todd A. Jacobs"

> range operator *still* catches more than it should. For example:
>
>     #!/usr/bin/ruby -w
>
>     ## one
>     ## two
>     ## three
>     ## four
>     ## five
>
>     File.open($0) do |file|
>         while file.gets
>             print $_.sub(/^## /, '') if
>                 ($_ =~ /^## two/)...($_ =~ /^## four/)
>         end
>     end
>
> prints up to "four" when (as I understand it) it should stop at "three"
> since "## four" would make the if-statement false. Am I still missing
> something obvious?
>
> --
> "Oh, look: rocks!"
>         -- Doctor Who, "Destiny of the Daleks"