Для нормальной работы в 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 выполняется
весьма своеобразно - перед выполнением команд копирования или изменения имени
файла нужно удостовериться, что вы уже закрыли его. Иначе они просто не выполнятся.
|