See also: How is "0" result from readdir not false in a while condition?. (Not a duplicate; just closely related.)
Where in the documentation does it say that while tests readdir for definedness? For instance, this code
#!/usr/bin/perl
use strict;
use warnings;
opendir my $dir, "/tmp" or die "$!";
while (my $file = readdir($dir)) {
print "$file\n";
}
closedir $dir;
when run through B::Deparse yields:
use warnings;
use strict 'refs';
die "$!" unless opendir my $dir, '/tmp';
while (defined(my $file = readdir $dir)) {
do {
print "$file\n"
};
}
z.pl syntax OK
I expect this behaviour, but I cannot find where it is specified. In the I/O Operators section of perlop it says
The following lines are equivalent:
while (defined($_ = <STDIN>)) { print; }
while ($_ = <STDIN>) { print; }
while (<STDIN>) { print; }
for (;<STDIN>;) { print; }
print while defined($_ = <STDIN>);
print while ($_ = <STDIN>);
print while <STDIN>;
But there is no mention of readdir.
You're quite right about it being undocumented. I've looked rather hard, and I can't find any reference to it being special either. It is special, as you've discovered, and as demonstrated by:
Looking through the source,
Perl_newWHILEOPinop.cspecifically has tests forreaddir,glob,readlineandeach... Hmm, let's do some digging, and see whenreaddirwas added.A bit of digging with
gitreveals that it's been that way since at least 1998, with Gurusamy Sarathy making the relevant change in commit55d729e4. While I haven't gone digging to see which releases that's gone into, I'd wager it would be at least 5.6.0 and above. I can't find any mention of it in the deltas.It might be mentioned in the third edition camel book, but I haven't checked to find out.
I think that a patch here (or even just a note to p5p) would certainly be appreciated.
Paul