Где в документации сказано, что во время тестирования readdir на определенность?

Смотрите также: Как "0" результат от readdir не ложно в состоянии while?, (Не дубликат; просто тесно связанный.)


Где в документации сказано, что во время тестирования readdir на определенность? Например, этот код

#!/usr/bin/perl

use strict;
use warnings;

opendir my $dir, "/tmp" or die "$!";

while (my $file = readdir($dir)) {
        print "$file\n";
}
closedir $dir;

при запуске через B:: Deparse выдает:

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

Я ожидаю такого поведения, но не могу найти, где оно указано. В разделе Операторы ввода / вывода perlop говорится

Следующие строки эквивалентны:

while (defined($_ = <STDIN>)) { print; }
while ($_ = <STDIN>) { print; }
while (<STDIN>) { print; }
for (;<STDIN>;) { print; }
print while defined($_ = <STDIN>);
print while ($_ = <STDIN>);
print while <STDIN>;

Но нет упоминания о readdir,

2 ответа

Вы совершенно правы в том, что у вас нет документов. Я выглядел довольно усердно, и я не могу найти никаких ссылок на то, что он особенный. Это особенное, как вы обнаружили, и это продемонстрировано:

$ perl -MO=Deparse \
       -E'opendir(my $dir, "."); while($_ = readdir($dir)) { say; }'

BEGIN {
    $^H{'feature_say'} = q(1);
    $^H{'feature_state'} = q(1);
    $^H{'feature_switch'} = q(1);
}
opendir my $dir, '.';
while (defined($_ = readdir $dir)) {
    say $_;
}
-e syntax OK

Просматривая источник, Perl_newWHILEOP в op.c специально есть тесты для readdir, glob, readline а также each... Хм, давайте покопаемся и посмотрим когда readdir был добавлен.

Немного покопаться с git показывает, что так было, по крайней мере, с 1998 года, когда Гурусами Сарати внесла соответствующие изменения в коммит 55d729e4, Несмотря на то, что я не копался, чтобы посмотреть, в какие выпуски он вошел, я бы поспорил, что он будет не ниже 5.6.0 и выше. Я не могу найти упоминания об этом в дельтах.

Это может быть упомянуто в верблюжьей книге третьего издания, но я не проверял, чтобы узнать.

Я думаю, что патч здесь (или даже просто примечание к p5p), безусловно, будет оценен.

Павел

Мне жаль, что я не думал обновлять страницы, которые вы ожидали найти эту информацию.

Я добавил примечание к readdir раздел perlfunc хоть.

Начиная с Perl 5.12 вы можете использовать голые readdir в while цикл, который установит $_ на каждой итерации.

opendir(my $dh, $some_dir) || die;
while(readdir $dh) {
    print "$some_dir/$_\n";
}
closedir $dh;

Это явно не говорит, что это проверяет определенность все же.

(Я хотел бы отметить, что добавление этой функции было моим первым патчем для ядра Perl.)

Другие вопросы по тегам