Этот вопрос является побочным из этого. Некоторая история: когда я впервые изучил Perl, я почти всегда использовал glob
, а не opendir
+ readdir
, потому что мне было проще. Затем несколько различных сообщений и чтений предположили, что glob
был плохим, и теперь я почти всегда использую readdir
.
После размышления над этим недавним вопросом я понял, что мои причины для одного или другого выбора могут быть койками. Итак, я собираюсь выложить некоторые "за" и "против", и я надеюсь, что более опытные люди из Perl могут перезвонить и уточнить. Вопрос в двух словах - есть ли веские причины предпочесть от glob
до readdir
или readdir
до glob
(в некоторых или во всех случаях)?
glob
профи:
- Нет dotfiles (если вы не попросите их)
- Заказ товаров гарантирован.
- Не нужно добавлять имя каталога в элементы вручную
- Лучшее имя (c'mon -
glob
versusreaddir
не является конкурсом, если мы судим только по именам) -
(От ответа ysth, cf.
glob
cons 4 ниже) Может возвращать несуществующие имена файлов:@deck = glob "{A,K,Q,J,10,9,8,7,6,5,4,3,2}{\x{2660},\x{2665},\x{2666},\x{2663}}";
glob
минусы:
- Старые версии просто сломаны (но "старше" означает pre 5.6, я думаю, и, честно говоря, если вы используете pre 5.6 Perl, у вас больше проблем)
- Вызывает
stat
каждый раз (т.е. бесполезное использованиеstat
в большинстве случаев). - Проблемы с пробелами в именах каталогов (это все еще верно?)
-
(От брайанского ответа) Может возвращать имена файлов, которые не существуют:
$ perl -le 'print glob "{ab}{cd}"'
readdir
профи:
- (Из ответа brian)
opendir
возвращает дескриптор файла, который вы можете передать в своей программе (и повторное использование), ноglob
просто возвращает список - (Из ответа Брайана)
readdir
является правильным итератором и предоставляет функцииrewinddir
,seekdir
,telldir
- Быстрее? (Чистая догадка, основанная на некоторых из функций
glob
сверху. Я так не волнуюсь об этом уровне оптимизации, но это теоретический профессионал.) - Меньше подвержены ошибкам краевого случая, чем
glob
? - По умолчанию (dotfiles) также читается (это тоже).
- Может убедить вас не называть файл
0
(а также - см. ответ Брэда) - Кто-нибудь? Bueller? Bueller?
readdir
минусы:
- Если вы не помните, чтобы добавить имя каталога, вы будете получать бит, когда вы пытаетесь делать файловые тесты или копировать элементы или редактировать элементы или...
- Если вы не помните
grep
из элементов.
и..
, вы будете получать бит при подсчете элементов или пытаться идти рекурсивно вниз по дереву файлов или... - Я уже упоминал о предложении имени каталога? (Sidenote, но мой самый первый пост в списке почтовых сообщений Perl Beginners был классическим: "Почему этот код с участием файловых задач не работает некоторое время?" Проблема, связанная с этой ошибкой. По-видимому, я все еще горький.)
- Элементы возвращаются в определенном порядке. Это означает, что вам часто приходится помнить, чтобы сортировать их в некотором роде. (Это может быть про, если это означает большую скорость, и если это означает, что вы действительно думаете о том, как и если вам нужно сортировать элементы.) Изменить: Horrifically small sample, но на Mac
readdir
возвращает элементы в алфавитном порядке, без учета регистра. В поле Debian и на сервере OpenBSD заказ является абсолютно случайным. Я протестировал Mac с Apple встроенным Perl (5.8.8) и моим собственным скомпилированным 5.10.1. Поле Debian - 5.10.0, как и машина OpenBSD. Интересно, это проблема файловой системы, а не Perl? - Считывает все (по умолчанию также и dotfiles) (это тоже pro)
- Не обязательно иметь дело с файлом с именем
0
(см. профи также - см. ответ Брэда)