Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Изучаем Perl - Шварц Р.

Шварц Р., Кристиансен Т. Изучаем Perl — Москва, 2002. — 324 c.
Скачать (прямая ссылка): izuchaemperl2002.djvu
Предыдущая << 1 .. 82 83 84 85 86 87 < 88 > 89 90 91 92 93 94 .. 124 >> Следующая

что данный файл в действительности открывается и для чтения, и для
записи. Например:
open (А, "+<Ь"); # открыть файл b для чтения-записи (ошибка,
если файл отсутствует)
open (С, "+>d"); # создать файл d с доступом для чтения-записи
open(Е, "+>>f"); # открыть или создать файл f с доступом для
чтения-записи
220
Изучаем Perl
Отметим, что все, что мы сделали - это добавили знак плюс к спецификации,
задающей направление ввода-вывода данных в файл.
Открыв файл, мы должны перейти на определенную позицию в нем. Это
делается с помощью функции seek, которая принимает те же три параметра,
что и библиотечная программа fseek(3). Первый параметр - это дескриптор
файла, а второй параметр задает смещение, которое интерпретируется в
совокупности с третьим параметром. Как правило, в качестве третьего
параметра ставится нуль, чтобы второй параметр задавал абсолютную позицию
для следующего чтения из файла или записи в файл. Например, чтобы перейти
к пятой записи в дескрипторе файла names (как описано выше), можно
сделать так:
seek(NAMES, 4*83,0);
После перемещения указателя в файле на нужную позицию следующая операция
ввода или вывода будет начинаться с этой позиции. Для вывода используйте
функцию print, но не забудьте, что записываемые данные должны иметь
строго определенную длину. Чтобы сформировать запись правильной длины,
можно воспользоваться функцией pack:
print NAMES pack("A40 A A40 s", $first, $middle, $last, $age);
В данном случае pack задает 40 символов для $first, один символ - для
Smiddle, еще 40 символов - для $last и короткое целое (два байта) для
$аде. Определенная таким образом запись будет иметь в длину 83 байта и
начинаться с текущей позиции в файле.
Наконец, нам нужно узнать, как выбрать конкретную запись. Конструкция
<names> возвращает все данные, начиная с текущей позиции и до следующего
символа новой строки, однако в нашем случае предполагается, что данные
занимают 83 байта и, вероятно, символ новой строки непосредственно в
записи отсутствует. Поэтому вместо нее мы используем функцию read,
которая по внешнему виду и принципу работы очень похожа на свою UNIX-
коллегу:
$count = read(NAMES, $buf, 83);
Первый параметр функции read - дескриптор файла. Второй параметр - это
скалярная переменная, в которую будут записаны прочитанные данные. Третий
параметр задает количество байтов, которые нужно прочитать. Возвращает
функция read количество фактически прочитанных байтов; как правило, оно
равно затребованному количеству байтов, если только дескриптор файла
открыт и если вы не находитесь слишком близко к концу файла.
Получив эти 83-символьные данные, разбейте их на компоненты с помощью
функции unpack:
($first, $middle, $last, $age) = unpack("A40 A A40 s", $buf);
17. Работа с пользовательскими базами данных
221
Как видно, строки, определяющие формат, в функциях pack и unpack -
одинаковы. В большинстве программ эту строку заносят в переменную,
указываемую в начале программы, и даже вычисляют с помощью функции pack
длину записей, а не используют везде константу 83:
$names = "А40 А А40 s";
$names__length = length (pack ($names) ) ; # вероятно, 83
Базы данных с записями переменной длины (текстовые)
Многие системные базы данных ОС UNIX (и довольно большое число
пользовательских баз данных) представляют собой наборы понятных человеку
текстовых строк, каждая из которых образует одну запись. Например, каждая
строка файла паролей соответствует одному пользователю системы, а строка
файла хостов - одному хост-имени.
Корректируются эти базы данных в основном с помощью простых текстовых
редакторов. Процедура обновления базы данных состоит из чтения ее в
какую-то временную область (память или другой дисковый файл), внесения
необходимых изменений и либо записи результата обратно в исходный файл,
либо создания нового файла с тем же именем, с одновременным удалением или
переименованием старой версии. Этот процесс можно рассматривать как
разновидность копирования: данные копируются из исходной базы данных в
новую ее версию с внесением изменений в процессе копирования.
Perl поддерживает редактирование такого типа в строчно-ориентированных
базах данных методом редактирования на месте. Редактирование на месте -
это модификация способа, посредством которого операция "ромб" (<>)
считывает данные из списка файлов, указанного в командной строке. Чаще
всего этот режим редактирования включается путем установки аргумента
командной строки -i, но его можно запустить и прямо из программы, как
показано в приведенных ниже примерах.
Чтобы запустить режим редактирования на месте, присвойте значение
скалярной переменной $ /ч I. Оно играет важную роль и будет сейчас
рассмотрено.
Когда используется конструкция о и переменная $Л1 имеет значение,
отличное от undef, к списку неявных действий, которые выполняет операция
"ромб", добавляются шаги, отмеченные в приведенном ниже коде
комментарием## in place ##:
$ARGV = shift @ARGV; open(ARGV,"<$ARGV");
Предыдущая << 1 .. 82 83 84 85 86 87 < 88 > 89 90 91 92 93 94 .. 124 >> Следующая