Где в документации сказано, что во время тестирования 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.)