opendir MYDIR, "$dir";
my @FILES = readdir MYDIR;
closedir MYDIR;
Кажется, что 99,9% времени первые две записи в массиве всегда“.” и “..”. Более поздняя логика в сценарии имеет проблемы, если это не верно. Я столкнулся со случаем, где записи каталога появились позже. Действительно ли это показательно из файловой системы, являющейся поврежденным или что-то еще? Существует ли известный порядок к тому, что возвращает opendir?
Это всегда порядок операционной системы, представленный несортированным сырым.
Хотя . и .. очень часто являются первыми двумя записями, это потому, что они были первыми двумя созданными записями. Если по какой-то причине одна из них была удалена (через неестественные последовательности, поскольку обычно это предотвращается), следующий fsck
(или эквивалент) исправит каталог, чтобы в нем снова были обе записи. Это поместит одно из имен на более позднее место в списке.
Следовательно, не надо просто "пропускать первые две записи". Вместо этого сопоставьте их явно, чтобы отбросить их.
Порядок ниже ОС и явно не иначе определено.
Их достаточно легко отфильтровать.
opendir MYDIR, "$dir";
my @FILES = grep !/^\.\.?$/, readdir MYDIR ;
closedir MYDIR;
Используйте File :: Slurp :: read_dir , который по умолчанию возвращает список, который не включает .
и ..
.