Документация
HTML CSS PHP PERL другое

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

 

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

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

Назад | Содержание | Вперед

© 2000- NIV