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

Итак, по всё порядку. Для работы с файлами используются дескрипторы файлов. Имя дескриптора выглядят как и имена скалярных переменных, массивов или хэшей, но перед именем дескриптора файла не ставится никакого символа. 

Пример:
FILE
DATAFILE

:: Открытие/Закрытие файла ::

Для работы с конкретным файлом нужный связать дескриптор файла с именем файла. Для этого используется функция open.

open (FILE,"filename.dat");

В этом примере FILE это имя дескриптора файла, а filename.dat это имя файла. Такая конструкция открывает файл для чтения. Чтобы открыть его для записи
нужно немного изменить код:

open (FILE,">filename.dat");

Знак ">" показывает, что файл открывается для
записи. В этом случае если файл уже существовал, то новая запись наносится поверх старой. Если вместо него поставить знак ">>", то новая запись добавится в конец файла, а старая останется.

open (FILE,">>filename.dat");

Для закрытия файла используется операция функция close.

close (FILE);

И open и close при успешном выполнении возвращают значение true и false в противном случае. Часто на практике это оказывается очень полезным и помогает определить в каком месте программа дала сбой.

Обычно это делают так:

open (FILE,"filename.dat") || die "Не могу открыть файл для чтения : $!";

Теперь поподробней. "||" это операция сравнения логического "ИЛИ". То есть или открывается файл или выполняется оператор, следующий после "||". В нашем случае это функция die, которая выводит сообщение, данное в круглых скобках, на стандартный вывод ошибок и прерывает выполнения программы. А переменная $! содержит последнее системное сообщение об ошибке.

Однако часто при отладке программ не нужно, чтобы программа умирала. Достаточно лишь вывода сообщения об ошибке. В этом случае просто заменяем die на warn :

open (FILE,"filename.dat") || warn "Не могу открыть файл для чтения : $!";

:: Работа с файлами ::

Чтение файла.

open (FILE,"filename.dat");
$line = <FILE>;
close (FILE);

В данном примере переменной $line присвоится первая строчка файла filename.dat, то есть все символы до перехода на новую строку. Подобным образом можно счесть сразу все строки и присвоить их массиву:

@strings = <FILE>;

Но можно и одной переменной присвоить весь текст файла. Для этого достаточно перед чтением файла вставить строку :

local $/ = undef;
$line = <FILE>;

Переменная $/ отвечает за символ перехода на новую строку, а мы просто меняем её значение с \n на неопределенное (undef), то есть никакой символ не считается символом перехода на новую строку.

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

while (<FILE>) {
$_= "string: " . $_;
print $_;
}

$_ - стандартная переменная, в которую помещается содержание текущей строки. В описанном выше примере мы сначала с помощью конкатенации меняем её значение на слово "string: " плюс оригинальное значение, а потом распечатываем результат. Так
как эта переменная дефолтовая, то можно было бы сделать операцию распечатывания ещё проще и убрать $_ вообще, то есть написать просто "print" :

$_= "string: " . $_;
print;

Запись в файл.

Для записи или добавлении информации в файл используется привычный оператор print, только после него указывается дескриптор файла, в который будет вносится это инфа:
open (DATA,">filename.dat");
print DATA "Hello X!\n";
close (DATA);

Вот и всё, здесь ничего сложного нет.

Проверка файлов.

Иногда бывает необходимость проверки на существование файл до его открытия, чтобы, например, не стереть старый файл при записи. Для этого существует операция проверки на наличие определенного файла :

-e $file_name

Она дает значение true в случае его существования и false в случае, если оного нет.

Пример:

$file_name = 'filename.dat';
if (-e $file_name) {
print "Файл $file_name уже существует!\n" }
else {
open (DATA,"> $file_name ");
print DATA "Cool file ;)\n";
close (DATA);
}

Если такой файл уже существует, то выдаётся соответствующее значение, а если ещё нет, то открывается новый дескриптор для записи.

Кроме простой проверки на наличия файла существует ещё огромное количество различных
операций проверок
файлов.

Приведу лишь наиболее полезные:

-r Файл или каталог доступен для чтения
-w Файл или каталог доступен для записи
-x Файл или каталог доступен для выполнения
-z Файл существует и имеет ненулевой размер
-s Выводит конкретный размер в байтах
-f Это обычный файл
-d Это каталог
-l Это символическая ссылка
-T Это текстовый файл
-B Это бинарный файл
-M Время с последнего изменения в днях
-A Время с последнего доступа в днях

Все эти операции можно группировать с помощью && (логическая операция "И")
if (-r $file_name && -w $file_name) {
# сделать что-то с файлом
}

Таким образом $file_name проверяется на возможность чтения и записи и если это так, то выполняются какие-то действия.

Удаление файла.

Очень простая операция, для этого используется функция unlink и имена файлов в качестве параметров:

$file_name = 'file.dat';
unlink ($file_name);
unlink ($file_name, "test.dat"); # удаляет оба файла

Переименование 

Для переименования файла используется функция rename и старое и новое имя для файла вместе с полным путём к нему:

$old_name = 'file.dat';
$new_name = '/home/hz/file2.dat';
rename ($old_name, $new_name);

Указание полного пути для нового файла обязательно!

Изменение прав доступа

Как и в UNIX, используется функция chmod. В качестве параметров число, определяющее права (аналогично как UNIX) и имени файла, которому меняются права.

$filename = 'file.dat';
chmod (0777, $filename);

Устанавливает файлу $filename права 777, то есть полный доступ. Иногда бывает очень полезно вместо того, что бы менять права каждому фалу с помощь ФТП-клиента сделать один файлик, который выполнит всю эту работу.

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

Check Also

Туннель во времени. Выводим данные с компьютера через Network Time Protocol

Содержание статьиЧто такое NTPСтруктура пакета NTPОграничения на трафик по порту UDP-123Ко…

Оставить мнение