Perl для системного администрирования


Прогулка по файловой системе - часть 2


Начнем мы с того, что откроем каталог, используя примерно тот же синтаксис, что и для открытия файла. Если попытка была неудачной, мы выходим из программы и выводим сообщение об ошибке ($! ), установленное вызовом opendir( ):

opendir(DIF), ". ") or die "He могу открыть текущий каталог: $'\л';

Мы получаем дескриптор каталога, в нашем случае DIR, который можно передать функции readdir( ), чтобы получить список файлов и каталогов в текущем каталоге. Если readdir() не может прочитать содержимое каталога, выводится сообщение об ошибке (которое объясняет, почему попытка была неудачной) и программа завершает работу:

# читаем имена файлов/каталогов данного каталога в @names

@names = readdir(DIR) or die "Невозможно прочитать текущий каталог:$! \n";

Затем закрываем открытый дескриптор каталога:

closedir(DIR);

Теперь можно работать с полученными именами:

foreach $name (@names) {

next if ($name eq "."); # пропускаем текущий каталог

next if ($name eq ".."); # пропускаем родительский каталог

if (-d $name){ # является ли каталогом?

print "найден каталог: $name\n"; next: # можно перейти к следующему имени

# из цикла for

}

if ($name eq "core") { # это файл с именем core?

print "найден! \n";

}

}

Теперь у нас есть очень простая программа, которая проверяет содержимое одного каталога. Она не только не обходит файловую систему, но даже не «проползает» по ней. Чтобы пройти по файловой системе, мы должны зайти во все каталоги, которые нам встретятся, и посмотреть на их содержимое. Если в этих подкаталогах есть еще подкаталоги, в них мы тоже должны заглянуть.

Когда у вас есть иерархия контейнеров и операция, которая одинаково выполняется на каждом внешнем контейнере и каждом внутреннем контейнере из этой иерархии, это называется рекурсией (по крайней мере в компьютерных науках). До тех пор пока иерархия не очень глубока и не зацикливается (т. е. все контейнеры содержат только непосредственно дочерние объекты и в них отсутствуют ссылки на другие части иерархии), рекурсивные решения имеют наибольший смысл.




- Начало -  - Назад -  - Вперед -



Книжный магазин