Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [ 25 ] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

# Выведен заголовок GIF-файла... print FH "GIF87a\056\001\04S\015\001)-; close(FH);

После открытия файла функцию к его дескриптору можно применить

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

Операторы тестирования файлов

Перед тем как открыть файл, неплохо убедиться, что он действительно существует,

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

-КдескрЕптор файла

-Хпуть

Здесь X - конкретная операция тестирования, тр файла - тестируемый дескриптор. Файл можно протестировать и без открытия дескриптора. В табл. 5.2 некоторые операторы тестирования.

Таблица 5.2а использцем1е оператор! теcтмроEания Файлов

Оператор

Пример

Результат

-r файл

Истинное значение, если разрешено чтение

файла

Истинное значение, если разрешена запись в файл, имя которого содержится в переменной $а

-e файл

Истинное значение, есл йл существует

-z файл

Истинное значение, есл йл существует, но он пустой

-s файл

Возвращает размер файла в байтах, если тот существует

-i файл

Истинное значение, есл йл является обычным файлом (не каталогом)

-d каталог

Истинное HHet если параметр млог задает каталог

-T файл

Истинное значение, если параметр йл определяет текстовый файл

-В файл

Истинное значение, если параметр определяетдвоичный файл

Возвращает количество прошедших дней с момента последней модификации файла

Полный список операторов тестирования файлов можно найти в документации. Наберите в командной строке perldoc perlfunc и найдите раздел Alphabetical List of Perl Functions.

Чть I. :ноEl Perl



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

print "Где будем сохранять данные?"; $filename=<STDIN>; сЬощ) 5filename; if (-s $filename ) {

warn "Содфжимое файла $file будет потеряно!\п";

warn "Он бьш модифицирован ",

-М $filenaine, "дней тому назадДи"

Резюме

На этом занятии вы изучали открытие и закрытие файлов с помощью функций open и close. Чтение открытого файла выполняется с помощью операторов <> или read, а запись в файл - с использованием оператора print. Еще вы узнали о некоторых особенностях работы онерационной системы с файлами и о том, зачем нужна функция bimnode.

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

Вопросы и ответы

Мой оператор open не работает по неизвестной причине. Что могло произойти?

Во-перв1х, проверьте синтаксис выражения с функцией open. Убедитесь, что правильно указано имя файла. Можете даже вывести это имя, перед тем как использовать его в open. Если вы собираетесь использовать файл для записи, не забудьте поставить префикс > перед именем файла, это необходимо. А проверяли ли вы, как выполнилась операция открытия файла с помощью синтаксиса open() j die "$!";?. Сообщение функции die может сильно облегчить поиск ошибки.

Я в1водил данные в файл, но их там не оказалось. Куда делись мои данные?

А вы уверены, что файл открыт правильно? Если вы используете неправильное имя файла, данные могут оказаться не в том файле, в каком дали. Распространенной ошибкой является использование символов обратной косой черты в пути файла, если путь заключен в двойные кавычки: open(FH, ">с:\temp\notes.txt") die "$!"; i Ошибка!

В этой строке создается фай вая CTpOKajotes.txt. Это явно не то, что нужно. Убедитесь также в успешном выполнении функции open. При отключенном режиме выдачи предупреждений Perl "молча" отбрасывает данные, выводимые в файл, который не был успешно открыт.

Я пытался открыть файл с помощью функции open, но получил сообщение permission denied. В чем тут дело?

Perl лишь следует правилам, регламентирующим безопасность в данной операционной системе. Если у вас нет нрава доступа к соответствующему файлу, каталогу или диску, то Perl ничего не может с этим поделать.



Как организовать посимвольный ввод данных?

Для посимвольного ввода из файла используется функция getc. Посимвольный ввод с клавиатуры - гораздо более серьезный вопрос, требующий учета особенностей конкретной операционной системы. После знакомства с модулями Perl на 15-м занятии, "Обработка данных в Perl" и чтения FAQ, речь о котором пойдет в 16-м занятии, "Сообщество Perl", посмотрите пятый раздел FAQ. В нем содержится развернутое объяснение принципов организации посимвольного ввода для различных платформ с многочисленными примерами кода. В этой книге мы не можем их привести.

Как избежать одновременной записи в один и тот ж йл со стороны различн1х программ?

Перед записью нужно выполнить блокировку файла. Более подробно эта тема обсуждается на 15-м занятии, "Обработка данных в Perl". Предупреждаем, это довольно

сложный вопрос!

Семинар

Контрольные вопросы

1. Чтобы открыть файл data для записи, нужно сделать следующее:

"data", write);

б) "data"); а затем просто выполнить печать в

(FH, ">data") 11 die "Ошибка при открпии data: $!";

2. Выражение (-М $file > 1 and -s $Ше) истинно, если:

а) файл $Ше бгл модифицирован не позднее, чем день назад, и содержит данные;

б) это выражение не может быть истинным;

в) запись в разрешена, и он не содержит данных.

Ответы

1. Правильный ответ - вариант в). У варианта а) неправильный синтаксис, а вариант б) открывает файл для чтения. Вариант в) - то, что нужно, и к тому же хорош для контроля ошибок.

2. Правильным является вариант а). Оператор -М возвращает количество дней, прошедших с момента последней модификации файла (выражение >1 означает, что количество дней должно быть больше одного), а оператор -s возвращает истинное значение лишь для файлов, содержащих данные.

Упражнения

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

I. ноEl Perl



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [ 25 ] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122