In these loop constructs, the assigned value (whether assignment is
automatic or explicit) is then tested to see whether it is defined.
The defined test avoids problems where line has a string value that
would be treated as false by Perl, for example a "" or a "0" with no
trailing newline. If you really mean for such values to terminate the
loop, they should be tested for explicitly:
doesn't mention readdir but I think it's a similar case (and a documentation hole)