Глава 17: Работа с пользовательскими базами данных.
17.5 Базы данных с записями переменной длины (текстовые)
Многие системные базы данных ОС UNIX (и довольно большое число пользовательских баз данных) представляют собой набори понятных человеку текстовых строк, каждая из которых образует одну запись. Например, каждая строка файла паролей соответствует одному пользователю системы, а строка файла хостов — одному хост-имени.
Корректируются эти базы данных в основном с помощью простых текстовых редакторов. Процедура обновлення базы данных состоит из чтения ее в какую-то временную область (память или другой дисковий файл), внесення необходимых изменений и либо записи результата обратно в исходный файл, либо создания нового файла с тем же именем, с одновременным удалением или переименованием старой версии. Этот процесс можно рассматривать как разновидность копирования: данные копируются из исходной базы данных в новую ее версию с внесением изменений в процессе копирования.
Perl поддерживает редактирование такого типа в строчно-ориентированных базах данных методом редактирования на месте. Редактирование на месте — это модификация способа, посредством которого операция "ромб" (<>) считывает данные из списка файлов, указанного в командной строке. Чаще всего этот режим редактирования включается путем установки аргумента командной строки -і, но его можно запустить и прямо из программы, как показано в приведенных ниже примерах.
Чтобы запустить режим редактирования на месте, присвойте значение скалярной переменной $^i. Оно играет важную роль и будет сейчас рассмотрено.
Когда используется конструкция о и переменная $^1 имеет значение, отличное от undef, к списку неявних действий, которые выполняет операция "ромб", добавляются шаги, отмеченные в приведенном ниже коде комментарием ## inplace ##:
$ARGV = shift 6ARGV;
open(ARGV,"<$ARGV");
rename($ARGV,"$ARGV$^1"); ## INPLACE ##
unlink($ARGV); ## INPLACE ##
open(ARGVOUT,">$ARGV"); ## INPLACE ##
select(ARGVOUT) ## INPLACE ##
В результате в операции "ромб" при чтении используется старый файл, а запись в дескриптор файла по умолчанию осуществляется в новую копию этого файла. Старый файл остается в резервной копии, суффикс имени файла которой равен значеним переменной $^1. (При этом биты прав доступа копируются из старого файла в новый.) Эти шаги повторяются каждый раз, когда новый файл берется из массива @argv.
Типичные значения переменной $^1 — .bak или ~, т.е. резервные файлы создаются почти так же, как это делается в текстовом редакторе. Странное и полезное значение $^1 — пустая строка (""), благодаря которой старый файл после редактирования аккуратно удаляется. К сожалению, если система при выполнении вашей программы откажет, то вы потеряете все свои старые данные, поэтому значение "" рекомендуется использовать только храбрецам, дуракам и излишне доверчивым.
Вот как можно путем редактирования файла паролей заменить регистрационный shell всех пользователей на /bin/sh'.
8ARGV = ("/etc/passwd"); # снабдить информацией операцию "ромб"
$^1 = ".bak"; # для надежности записать /etc/passwd.bak
while (о) { # основной цикл, по разу для каждой строки файла /etc/passwd
s#: [^:]*$#:/bin/sh#; # заменить shell на /bin/sh
print; # послать выходную информацию в ARGVOUT: новый /etc/passwd
}
Как видите, эта программа довольно проста. Однако ее можно заменить всего лишь одной командой с несколькими аргументами командной строки, например:
perl -р -і.bak -е 's#: [^:]*$#:/bin/sh#' /etc/passwd
Ключ -р охватывает вашу программу циклом while, который включает оператор print. Ключ -і устанавливает значение переменной $^1. Ключ -е определяет следующий аргумент как фрагмент Perl-кода для тела цикла, а последний аргумент задает начальнее значение массива @argv.
Более подробно аргументы командной строки рассматриваются в книге Programming Perl и на man-странице perlrun.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|