Обработка всех файлов каталога
Проблема
Требуется выполнить некоторые действия с каждым файлом данного каталога.
Решение
Откройте каталог функцией
opendir
и последовательно читайте имена файлов функцией
readdir:
opendir(DIR, $dirname) or die "can't opendir $dirname: $!";
while (defined($file = readdir(DIR))) {
# Сделать что-то с "$dirname/$file"
}
closedir(DIR);
Комментарий
Функции opendir, readdir и closedir работают с каталогами по аналогии с функциями
open,
read и
close,
работающими с файлами. В обоих случаях используются манипуляторы, однако манипуляторы
каталогов, используемые opendir и другими функциями этого семейства, отличаются от файловых
манипуляторов функции open и других. В частности, для манипулятора каталога нельзя
использовать оператор <>.
В скалярном контексте readdir возвращает следующее имя файла в каталоге, пока не будет
достигнут конец каталога — в этом случае возвращается
undef. В списковом контексте возвращаются
остальные имена файлов каталога или пустой список, если файлов больше нет. Как объяснялось
во введении, имена файлов, возвращаемые readdir, не содержат имя каталога. При работе с именами,
полученными от readdir, необходимо либо заранее перейти в нужный каталог, либо вручную
присоединить его к имени.
Ручное присоединение может выглядеть так:
$dir = "/usr/local/bin";
print "Text files in $dir are:\n";
opendir(BIN, $dir) or die "Can't open $dir: $!";
while( defined ($file = readdir BIN) ) {
print "$file\n" if -T "$dir/$file";
}
closedir(BIN);
Мы проверяем $file с помощью
defined,
поскольку простое условие while ($file = readdir BIN) проверяет истинность, а не
определенность. Хотя наш цикл завершается после перебора всех файлов, возвращаемых
readdir, он также завершится преждевременно при наличии файла с именем "0".
Функция readdir также возвращает специальные каталоги "." (текущий каталог) и ".."
(родительский каталог). Обычно они пропускаются фрагментом следующего вида:
while ( defined ($file = readdir BIN) ) {
next if $file =~ /^\.\.?$/; # Пропустить . и ..
# ...
}
См. такжеОписание функций
closedir,
opendir,
readdir,
rewinddir,
seekdir и
telldir
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|