Чтение онлайн

ЖАНРЫ

Язык программирования Perl

Шохирев Михаил Васильевич

Шрифт:

print "$file - является каталогом!" if -d $file;

В Perl есть целый набор встроенных функций для работы с файлами, с помощью которых можно манипулировать с самими файлами, а не с данными, хранящимися в них.

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

$ok = rename("$path/$old_name", "$path/$new_name");

Функция unlink удаляет файл или список файлов, возвращая число 1 при

успешном удалении и 0 - при ошибке.

unlink($list, $of, $files); # удалить список файлов

unlink $file if -e $file; # удалить файл, если он существует

Функция truncate усекает файл до указанного размера и возвращает число 1 в случае успешного выполнения усечения и неопределенное значение undef– при возникновении ошибки. Файл может задаваться именем или файловым манипулятором. Например:

$ok = truncate($file, $size);

Функция stat возвращает информацию о файле в виде списка или пустой список при неудаче. Файл может задаваться манипулятором файла или выражением со значением имени файла:

@info = stat($file); # получить всю информацию о файле

$size = $info[7]; # размер файла в байтах

$modified = localtime($info[9]); # время изменения файла

Подробное описание всех элементов информационного списка можно найти в документации, указав утилите чтения документов имя функции следующим образом:

perldoc -f stat

Функция utime изменяет у файла (или нескольких файлов из заданного списка) время доступа и время модификации, задаваемые числовыми значениями.

utime($access_time, $modified_time, @list_of_files);

Кроме упомянутых, есть еще встроенные функции для изменения прав доступа и владельца файла, для чтения и создания символических и жестких ссылок. Немало разных функций для работы с файлами имеются в стандартной библиотеке модулей Perl, еще больше можно найти в хранилище модулей CPAN.

Помимо работы с файлами, в Perl есть необходимый набор встроенных функций для работы с каталогами. Нужно иметь в виду, что успешность выполнения операций с каталогами зависит от набора прав пользователя, от лица которого выполняется Perl-программа.

Функция mkdir создает каталог с указанным именем. Вторым аргументом функции можно задавать права доступа для создаваемого каталога (в соответствии со стандартом POSIX). Возвращает число 1 при успешном создании или 0 при ошибке. Причину неудачи при создании каталога можно узнать из специальной переменной $!, которая содержит сообщение об ошибке.

$ok = mkdir $directory_name; # создать каталог

mkdir $dir, $access_rights; # создать каталог, задав права

Функция rmdir удаляет каталог по его имени, если он пуст, возвращает число 1 при успешном удалении каталога или 0 в случае ошибки. Тогда из переменной $! можно выяснить подробности неудачи:

$ok = rmdir $directory_name; # удалить каталог

Функция chdir изменяет текущий каталог на значение строкового выражения, содержащего имя нового текущего каталога. Если имя каталога не задано, она переходит

в домашний каталог пользователя, используя значение элемента $ENV{"HOME"} или $ENV{"LOGNAME"} из специального хэша %ENV, который содержит значения переменных окружения операционной системы. Возвращает число 1 при успешном переходе в другой каталог или 0 в случае возникновения ошибки.

$ok = chdir $new_dir; # перейти в каталог $new_dir

chdir; # перейти в домашний каталог

Много других возможностей по работе с каталогами предоставляют функции из стандартной библиотеки модулей Perl. Например, функция cwd из стандартного модуля Cwd возвращает имя текущего (рабочего) каталога во время выполнения программы:

use Cwd; # подключить библиотечный модуль Cwd

my $current_work_directory = cwd; # запросить текущий каталог

Иногда при выполнении программы нужно определить каталог, откуда она была запущена, чтобы организовать доступ к его подкаталогам. Переменная Bin, устанавливаемая в модуле FindBin из стандартной библиотеки, содержит имя каталога, из которого программа была запущена, например:

use FindBin; # подключить библиотечный модуль FindBin

my $program_start_dir = $FindBin::Bin; # стартовый каталог

Perl также предоставляет набор функций, организующий чтение содержимого каталога, подобно чтению записей файла. Элементами каталога могут быть обыкновенные файлы и другие каталоги, включая вложенные подкаталоги, текущий каталог (обозначаемый одной точкой) и родительский каталог (обозначаемый двумя точками).

Перед чтением содержимого каталога его необходимо открыть. Функция opendir открывает каталог по его имени и ассоциирует его с указанным манипулятором каталога. Функция возвращает число 1 при успешном открытии, undef– при неудаче. Вот так, например, открывается каталог и создается манипулятор каталога DIR_HANDLE:

$ok = opendir DIR_HANDLE, $directory_name;

Современный стиль программирования рекомендует при открытии каталога сохранять манипулятор каталога в скалярной переменной. Это ограничивает область его видимости текущим блоком или подпрограммой и предотвратит случайное изменение манипулятора в других частях программы. Например, так:

$ok = opendir my $dir_handle, $directory_name;

Функция closedir закрывает каталог, открытый функцией opendir, используя манипулятор каталога. Возвращает число 1 при успешном закрытии или undef– при неудаче. Хотя открытые каталоги автоматически закрываются по окончании программы, рекомендуется все же делать это явно:

$ok = closedir $dir_handle; # закрыть каталог

Функция readdir в скалярном контексте читает очередной элемент каталога, возвращая неопределенное значение undef, когда будет прочитан последний элемент. Например:

my $file_name = readdir $dir_handle;

Таким образом можно организовать обработку всех элементов каталога в цикле, исключая текущий и родительский каталоги:

Поделиться с друзьями: