Почему Perl-скрипт читает файлы из каталога в случайном порядке? - PullRequest
1 голос
/ 11 июня 2009

Я написал Perl-скрипт, который открывает каталог, состоящий из различных файлов. Кажется, что скрипт не читает файлы в каком-либо последовательном порядке (ни по алфавиту, ни по размеру), а читает их случайным образом. Мне было интересно, что может быть причиной того же?

Ответы [ 4 ]

11 голосов
/ 11 июня 2009

Это никогда не случайно, это просто шаблон, который вы не узнаете. Если вы посмотрите на документацию, описывающую реализацию какой-либо функции, которую вы используете для чтения каталога, вероятно, она скажет что-то вроде: не гарантирует порядок чтения файлов.

Если они вам нужны в определенном порядке, сортируйте имена, прежде чем оперировать ими.

Файлы, вероятно, читаются в порядке, удобном для базовой файловой системы. Таким образом, в некотором смысле, файлы упорядочены, но не в том порядке, в котором вы ожидаете (размер или алфавит). Иногда файлы имеют внутренний числовой идентификатор, и файлы могут быть возвращены в числовом порядке с указанным идентификатором. Но с этим идентификатором вы, вероятно, не встретитесь часто, если когда-либо.

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

Смотри также: http://www.perlmonks.org/?node_id=175864

10 голосов
/ 11 июня 2009

Вероятно, он читает их в соответствии с порядком, в котором они хранятся в списке файлов каталога. В некоторых Unix-подобных файловых системах каталог представляет собой неупорядоченный список имен файлов и inode, которые указывают на содержимое (это чрезвычайно упрощено).

4 голосов
/ 11 июня 2009

Записи каталога не хранятся в отсортированном порядке, и вы не должны предполагать, что они хранятся таким образом. Если вы хотите отсортировать их, вы должны отсортировать их. Например, сравните вывод:

perl -e 'opendir DIR, "."; print join("\n", sort readdir(DIR)); print "\n";'

perl -e 'opendir DIR, "."; print join("\n", readdir(DIR)); print "\n";'
2 голосов
/ 11 июня 2009

Если ваш сценарий использует opendir() (прямо или косвенно), вы не можете предполагать порядок упорядочения файлов, которые он возвращает; это будет зависеть от ОС и типа файловой системы, к которой вы обращаетесь. Пара вариантов:

  1. используйте два цикла: один для чтения всех имен файлов, второй для обработки их в требуемом порядке.
  2. используйте некоторую другую команду (например, вызов "ls"), чтобы принудительно вернуть имена файлов в требуемом порядке.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...