Анимация
JavaScript
|
Главная Библионтека # Выведен заголовок 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ания Файлов
Полный список операторов тестирования файлов можно найти в документации. Наберите в командной строке 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 |