Где в документации сказано, что во время тестирования readdir на определенность? - PullRequest
5 голосов
/ 10 мая 2009

См. Также: Как "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 ]

6 голосов
/ 10 мая 2009

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

$ 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), безусловно, приветствуется.

Пол

2 голосов
/ 21 января 2014

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

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

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

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

В нем явно не сказано, что он проверяет определенность.

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

...