П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 3520 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 6121 раз(а).

Учебник HTML.
Просмотров 3276 раз(а).

Руководство по PHP5.
Просмотров 5497 раз(а).

Хостинг через призму DNS.
Просмотров 4145 раз(а).

Подборка текстов стандартных документов.
Просмотров 55773 раз(а).

Учебник PHP - Самоучитель
Просмотров 3091 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 5724 раз(а).

Внешние атаки...
Просмотров 3841 раз(а).

Учебник PHP.
Просмотров 2825 раз(а).

SSI в примерах.
Просмотров 37463 раз(а).



 
 
| Добавить в избранное | Сделать стартовой | Помощь





Глава 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.

Назад | Вперед
Содержание (общее) | Содержание раздела



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru