Шрифт:
Функция chdir изменяет текущий каталог на значение строкового выражения, содержащего имя нового текущего каталога. Если имя каталога не задано, она переходит в домашний каталог пользователя, используя значение элемента $ENV{"HOME"} или $ENV{"LOGNAME"} из специального хэша %ENV, который содержит значения переменных окружения операционной системы. Возвращает число 1 при успешном переходе в другой каталог или 0 в случае возникновения ошибки.
Много других возможностей по работе с каталогами предоставляют функции из стандартной библиотеки модулей Perl. Например, функция cwd из стандартного модуля Cwd возвращает имя текущего (рабочего) каталога во время выполнения программы:
Иногда при выполнении программы нужно определить каталог, откуда она была запущена, чтобы организовать доступ к его подкаталогам. Переменная Bin, устанавливаемая в модуле FindBin из стандартной библиотеки, содержит имя каталога, из которого программа была запущена, например:
Perl также предоставляет набор функций, организующий чтение содержимого каталога, подобно чтению записей файла. Элементами каталога могут быть обыкновенные файлы и другие каталоги, включая вложенные подкаталоги, текущий каталог (обозначаемый одной точкой) и родительский каталог (обозначаемый двумя точками).
Перед чтением содержимого каталога его необходимо открыть. Функция opendir открывает каталог по его имени и ассоциирует его с указанным манипулятором каталога. Функция возвращает число 1 при успешном открытии, undef– при неудаче. Вот так, например, открывается каталог и создается манипулятор каталога DIR_HANDLE:
Современный стиль программирования рекомендует при открытии каталога сохранять манипулятор каталога в скалярной переменной. Это ограничивает область его видимости текущим блоком или подпрограммой и предотвратит случайное изменение манипулятора в других частях программы. Например, так:
Функция closedir закрывает каталог, открытый функцией opendir, используя манипулятор каталога. Возвращает число 1 при успешном закрытии или undef– при неудаче. Хотя открытые каталоги автоматически закрываются по окончании программы, рекомендуется все же делать это явно:
Функция readdir в скалярном контексте читает очередной элемент каталога, возвращая неопределенное значение undef, когда будет прочитан последний элемент. Например:
Таким образом можно организовать обработку всех элементов каталога в цикле, исключая текущий и родительский каталоги:
В списочном контексте функция readdir возвращает список всех элементов каталога, что часто бывает весьма удобно:
Иногда требуется, не закрывая каталога, начать его обработку сначала. Функция rewinddir устанавливает позицию чтения в начало открытого каталога, после чего чтение начнется с первого элемента:
Функция telldir возвращает текущую позицию в каталоге, которую можно использовать для перемещения в эту позицию с помощью функции seekdir: