Анимация
JavaScript
|
Главная Библионтека Если при чтении в массив слишком большого файла или выполнении каких-нибудь других действий доступная для Peri память будет исчерпана, интерпретатор втдаст сообщение об ошибке Out of memory! и прекратит выполнение программы. Если это произойдет при чтении всего файла в массив, вам следует подумать о построчной обработке файла. Запись в файл ДЛЯ записи данных в файл сначала нужно открыть сам файл для записи. Синтаксис открытия файла для записи почти такой же, как и для чтения: ореп{деотрилтор, >путь) ореп(дескриптор, »путь) Синтаксис первой строки уже знаком нам, за исключением символа > перед путем. Этот символ говорит Perl, что в файл, путь которого указан следом, должны быть записаны новые данные. При этом уже имеющиеся данные в файле стираются и указанный дескриптор открывается для записи. Во втором примере символы » говорят Perl, что файл открывается для записи, но если файл уже существует, новые данные дописываются после имеющихся. Вот примеры: Новые данные записываются поверх старых, если таковые есть open{NEWrH, ">output.txt") die "Оппйка при открьп-ии output.txt: $!"; t Нов1е данн1е допис1ваются к уже существующим. open(APPFH, "»logfile.txt") die " Оппйка при опфьпии logfile.txt: $!"; До сих пор ваши программы на Perl вряд ли могли причинить какой-либо вред. Теперь, когда вы узнали, как записывать данные в файлы, следует очень осторожно использовать эту возможность, чтобы случайно не повредить ценную информацию. В системах с незащищенными системными файлами (Windows 9х и Мае) можно легко повредить операционную систему, случайно уничтожив один из ее файлов. Поэтому тщательно контролируйте, какие файлы вы открываете для записи. Восстановить прежнюю информацию в файле, открытом с помощью префикса >, практически невозможно. Восстановление файлов, случайно открытых с помощью префикса », может оказаться довольно сложным процессом, так что будьте начеку. После окончания работы с файлом, открытым для записи, вопросом первостепенной важности становится закрытие этого файла и освобождение его дескриптора. Операционная система не переносит данные на диск тут же, как только совершается операция записи, данные вначале записываются в буфер, который периодически сохраняется на диске. Функция close сообщает операционной системе, что запись в файл завершена и данные должны быть помещены в место своего постоянного хранения на диске, например: close(KEWFH); close(APPFH); После того как файл открыт для записи, поместить в него данные очень просто. Это делается с помощью хорошо вам знакомой функции print. Пока функция print использовалась нами лишь для отображения данных на экране. В принципе эта функция может быть использована для записи данных в любой файл. Синтаксис оператора print, предназначенного для вывода данных в файл, очень прост: print дескриптор СПИСОК Здесь параметр дескриптор - это дескриптор файла, открытого для записи, а СПИСОК- список элементов, которые нужно вывести в файл. Примите во внимание, что синтаксис оператора print не допускает наличия запятой между именем дескриптора и списком. Однако внутри списка занятая используется для разделения элементов списка, как и прежде. Отсутствие занятой между дескриптором и списком говорит Peri, что лексема, следующая за print, - дескриптор файла, а не первый элемент списка. Если вы забудете об этом и поставите запятую, Perl выдаст вам сообщение: No оашн allowed after filehandle (если включен режим вывода предупреждений). Теперь рассмотрим следующий код: open (DCGF, "»logfile") II die •$! "; if (! Ecint DXF "Запись сделана scalar (localtime), "\n") { warn QiK&a ipzr загии в айп Icgfile: $!"; close(LOGF); В этом примере файл logfile открывается для добавления информации. Оператор print выводит сообщение в дескриптор lOGI? Значение, возвращаемое функцией print, проверяется, и, если запись не может быть сделана, выводится предупреждение. Затем дескриптор файла закрывается. Одновременно можно открыть сразу несколько файлов для чтения или записи, как показано в следующем примере: open(SOnRCE, "soursefile") open(DEST, ">destination") die "Si"; econtents=<SOnRCE>; ♦ "Прсогшм" изсщеьй айп pdut EESr eContents; I Запкиш его в дЕ5тей айп close(DEST); close(SOURCE); В этом примере выполняется простое копирование файлов. Кстати, можно несколько сократить код, объединив в одном операторе операции чтения и записи: print DE <SOURCE>; Так как функция print в качестве параметра ожидает передачи списка, оператор <SOURCE> находится в контексте списка. Угловой оператор в контексте списка считывает весь файл, а оператор print выводит его в дескриптор DEST. Свободные дескрипторы, тестирование файлов и двоичные данные С точки зрения файловой системы, файлы не обязательно должны быть связаны с данными, хранящимися на диске. Иногда дескриптор может быть связан с объектом операционной системы, например с клавиатурой, сетевым каналом или устройством резервного копирования на магнитную ленту. Кроме того, в файловой системе хранятся так называемые метаданные, относящиеся к вашим файлам. Perl может запрашивать файловую систему о размере конкретного файла, времени и исполнителе его последней модификации, а также о том, какого рода данные находятся в файле. В некоторых операционных системах файловые метаданные содержат даже информацию о том, является ли файл текстовым или двоичным. 90 Часть I. Ос1 Perl Свободные дескрипторы Perl начал свою жизнь в качестве утилиты для UNIX. Поэтому иногда это нроис-хождение проявляется и на других, отличных от платформах. Перед запуском программы на Perl для нее автоматически создаются три дескриптора файлов: STDOUT (стандартный выходной поток), (стандартный входной поток) и (стандартный поток ошибок). По умолчанию все они связаны с терминалом. Для считывания введенного вами с клавиатуры текста в Perl используется дескриптор $guess=<STDIN>; Для вывода данных на экран терминала предусмотрена функция print, которая по умолчанию использует дескриптор файла STDOUT, например: print "Привет всем!\н"; * то же, что и... print SnXUr "Привет всен!\п"; На 12-м занятии, "Работа с командной строкой rl", вы узнаете, как изменить имя дескриптора файла, который по умолчанию используется в функции print. Дескриптор STDERR обычно также связан с терминалом. Он используется отображения сообщений об ощибках. В UNIX сообщения об ощибках и обычные данные могут быть выведены на различные мониторы. Поэтому традиционный подход заключается в том, чтобы выводить сообщения об ошибках в стандартный поток ошибок STDERR. Например, функции die и warn выводят свои сообщения в STDERR. Если операционная система не поддерживает отдельного потока ошибок, как, например, в случае DOS или Windows, поток iriD выводится в DOUT. Вопрос о перенаправлении вывода и сообщений об ошибках в UNIX выходит за рамки этой книги. В различных оболочках это делается по-своему. Данная тема подробно рассматривается в любой более-менее приличной книге по UNIX. Работа с бинарными файлами Некоторые операционные системы, такие как VMS, Atari ST и в особенности Windows и DOS, различают двоичные (бинарные) и текстовые файлы. Это вызывает определенные проблемы, так как Perl не видит между ними отличий. Текстовые файлы состоят из записей, оканчивающихся символами конца строки, называемыми разделителями записей. Двоичные файлы - это набор битов, которые должны быть правильно интерпретированы, например изображения, программы и файлы данных. Когда выполняется запись данных в текстовый файл, Perl рассматривает символ \п как разделитель записей, принятый в данной операционной системе. В UNIX \n преобразуется в ASCII-код 10 (символ LF), в Macintosh и Windows - в ASCII-коды 13 и 10 (CRLF). Это особенность текстовых файлов. При записи двоичных данных, таких как файлы GIF, EXE, документы MS Word и т.п., преобразование данных не требуется. Поэтому, чтобы ни Perl, ни операционная система не делали подобных преобразований, перед записью двоичных данных в файл необходимо использовать функцию biirmode. Она помечает дескриптор файла как двоичный. Функция binmode вызывается после открытия файла, но до того, как будет выполнен ввод или вывод данных. Вот пример: open(FH, "camel.gif) j die "$!"; .. , bimDode(FB}; t ДЖЕишор с1аьов1(пкя двоичным. 5-й час. Работа с файлами 91 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 |