On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru








 

Работа с файлами и каталогами

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

Дескриптор Описание
STDIN Стандартный ввод (по умолчанию с клавиатуры)
STDOUT Стандартный вывод (обычно на консоль; во многих Web-приложениях в браузер)
STDERR Устройство, в которое выводится сообщение об ошибке (обычно на консоль, а на Web-сервере это зачастую лог-файл ошибок сервера)

Дескриптор представляет собой особый вид символьных переменных (literal string). Дескрипторы файлов, так же как и метки, применяются без специального префиксного символа, поэтому их можно спутать с существующими или зарезервированными словами (для подпрограмм, команд и пр.). При программировании названия дескрипторов рекомендуется писать только прописными буквами. Во-первых, они легко различимы среди остального текста, во-вторых, благодаря этому программа будет правильно выполняться. Дескриптор обычно представляет собой 'название' файла, на который ссылается пользователь. Как и при программировании на Basic, Pascal или C/C++, дескрипторы в Perl подобны переменным, присутствующим в синтаксисе операций открытия, закрытия, считывания или записи в файл. Подобно другим языкам, Perl также использует дескрипторы в операциях манипулирования содержимым файлов. Однако есть и другие варианты их применения.

Существует три разных способа открытия файла для проведения чтения (read), дополнения (append) и записи (write).

Режим чтения (Read) - самый простой. Синтаксис операции open следующий:

open (HANDLE,'filename.txt');

Оператор open используется для открытия файла. В круглых скобках заключен дескриптор файла HANDLE. В дальнейшем при выполнении операций над файлом filename.txt и его содержимым на него будут приведены ссылки в программе. В кавычках стоит имя файла.

Для считывания информации из файла выполняется так называемая операция ромба, обозначаемая символами (<>):

open (HANDLE,'filename.txt');
while (<HANDLE>) {
# Этот цикл будет считывать информацию из файла построчно
}

Режим записи (Write) имеет следующий вид:

open (HANDLE,'>filename.txt');

Отличие синтаксиса операций записи от синтаксиса чтения заключается лишь в том, что перед именем файла стоит символ 'больше чем' (>). Этот знак сообщает, что следует создать указанный в кавычках файл и записать или обновить (если он уже существует) его содержимое. Чтобы записать в него информацию, нужно обратиться к помощи оператора print:

open (HANDLE,'>filename.txt');
print HANDLE 'Записать этот текст в файл...';

Режим добавления (Append) синтаксически выглядит так:

open (HANDLE,'>>filename.txt');
print HANDLE 'Дописать этот текст в файл...';

Он схож с режимом записи. Разница лишь в том, что при его описании ставится двойной знак 'больше чем' (>>). Если указанный файл не существует, то он будет создан, в противном случае введенная информация будет добавлена в конец. Когда выполняется операция дополнения, данные можно не только записывать, но и считывать из файла.

В случае успешного выполнения все формы функции open возвращают значение true, а в случае неудачи - false. Например, если при попытке открыть файл для чтения выдается значение false, то это означает, что файла нет или доступ к нему запрещен. А когда при открытии файла для ввода информации это значение возвращается, то можно сделать вывод, что либо файл защищен от записи, либо невозможна запись в каталог или доступ к нему. Если затем программа завершит свою работу или файл заново откроется, то не нужно закрывать его после окончания работы с дескриптором - операция открытия файла закрывает ранее задействованный дескриптор. Тем не менее лучше все же закрыть файл с помощью операции close. Подобная структура является 'хорошим тоном' при программировании:

close (HANDLE);

Отладка. Всякий раз при открытии файла разумно использовать вместе с оператором open оператор die. Бывает, что файл по какой-то причине нельзя правильно открыть. Программа вроде бы выполнилась, как требовалось, а в файл записалось вовсе не то, что ожидалось. В подобном случае оператор die прерывает выполнение программы и выдает сообщение об ошибке при открытии файла.

В синтаксисе совмещения open и die используется 'логическое ИЛИ' (||):

open (HANDLE,'>>filename.txt') || die 'Ошибка добавления в файл filename.txt $!\n';

Функция die, название которой можно перевести с английского как 'откройся или умри', прерывает выполнение программы. Выдается сообщение об ошибке, а также информация о том, что ее вызвало. Perl сохраняет сведения о последней системной ошибке в специальной переменной $!. Если после функции die вставить $!, то от ОС будут получены дополнительные данные, которые помогут отладить программу.

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

$filename = 'filename.txt';
if (-e $filename) {
	print 'Файл $filename уже существует\n';
} else {
	print 'Файл $filename не найден\n';
}

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

if (-e 'filename.001' && -e 'filename.002') {

Есть множество других операций для проверки файлов. Например, чтобы убедиться в наличии какого-либо файла и возможности чтения из него, нужно вместо операции -e выполнить -r, а в случае требования возможности записи -w. Можно проверить один и тот же файл на доступность чтения и записи информации, выполнив следующее:

$filename = <STDIN>;
chomp ($filename);# убрать символ новой строки
if (-r $filename && -w $filename) {
	# файл существует, мы можем читать из него
# и записывать в него
. . .
}

Чтобы определить возможность чтения для целой группы файлов с одинаковым расширением, можно использовать конструкцию:

@files = <*.txt>;
foreach (@files) {
	print '$_ is readable\n' if -r;
}

При большинстве подобных проверок, а их около 20, возвращается значение true или false.

Отличия от Win32. При работе на Perl под управлением Windows существуют некоторые нюансы, о которых следует знать. Во-первых, нужно указывать полный путь к файлу (вместе с именем диска), над которым будут выполняться какие-либо действия, например

open (HANDLE,'c:/scripts/newfile.txt') || die 'Error opening c:/scripts/newfile.txt $!\n';
...
close (HANDLE);

Во-вторых, блокировка файла происходит иначе, чем в Unix-системах. При использовании Windows 9.x эта операция вообще не поддерживается, а в Windows NT выполняется весьма своеобразно - перед выполнением команд копирования или изменения имени файла нужно удостовериться, что вы уже закрыли его. Иначе они просто не выполнятся.

Назад       Главная       Вперёд