If you are processing big files you might want to avoid
slurping the whole thing at once. Here the range operator
<kbd>...</kbd> comes in handy. When used in a scalar
context it returns a boolean and does just what you need here:

The magic is in the three dots: When
the first line is processed, the three
dots are in the "false" state.
They take the expression on the left (<kbd>/$start/</kbd>)
and evaluate it. If the expression returns false
everything stays the same, the three dots return false.
If the expression returns true, the three dots
return true and go into the "true" state.

The next time we come to the three dots, the expression
on the right is evaluated.
If it returns false, everything says the same:
the three dots continue to return true. If
the expression returns true, the three dots go back
into the true state.

But once you've grokked all that, you just
think of the whole while + if + ... construct
as "from /$start/ to /$end/"

With two dots, it's possible for both the start and
end checks to be true on the same line. This means that
the operator goes from false to true and back to false
again on one evaluation. With three dots, if the start
check is true, then the end check isn't checked until the
next evaluation - thus forcing at least one
iteration with the operator returning true.

When putting a smiley right before a closing parenthesis, do you:

Use two parentheses: (Like this: :) )
Use one parenthesis: (Like this: :)
Reverse direction of the smiley: (Like this: (: )
Use angle/square brackets instead of parentheses
Use C-style commenting to set the smiley off from the closing parenthesis
Make the smiley a dunce: (:>
I disapprove of emoticons
Other