Анимация
JavaScript


Главная  Библионтека 

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

Переменная $ length содержит количество адресов. Это лишняя информация, так как в любом случае можно посмотреть на размер массива @addrs.

Наиболее полезная часть возвращаемого значения - массив @addrs. Каждый элемент данного массива - это отдельный IP-адрес, представленный во внутреннем формате и обрабатываемый в Perl как четырехсимвольная строка*. Эта четырехсимвольная строка представлена в форме, понятной для других сетевых Perl-функций. Однако предположим, что нам требуется вывести результат в виде, удобном для пользователя. В данном случае нам нужно с помощью функции unpack и еще нескольких операций преобразовать возвращаемое значение в удобочитаемый формат. Вот код, который обеспечивает вывод одного из IP-адресов хоста slate.bedrock.com:

(Saddr) = (gethostbynarae("slate.bedrock.com"))[4]; print "Slates address is ",

join(".",unpack("C4", $addr)), "\n";

Функция unpack получает четырехбайтовую строку и возвращает четыре числа. Оказывается, они стоят именно в том порядке, который нужен функции join для того, чтобы она вставила между каждой парой чисел точку и представила таким образом все это в удобочитаемой форме. Информация о простых программах-клиентах приведена в приложении В.

Упражнение

Ответ см. в приложении А.

1. Напишите программу, которая создает таблицу соответствия идентификаторов пользователей и реальных имен из записей файла паролей, а затем с помощью этой таблицы выводит список реальных имен, принадлежащих каждой группе, упомянутой в файле групп. (Включает ли ваш список тех пользователей, у которых в записи файла паролей стоит группа по умолчанию, но в записи файла групп явного упоминания этой группы нет? Если не включает, как это сделать?)

По крайней мере до IPv6.



в этой главе:

• DBM-базы данных и DBM-xeuiu

• Открытие и закрытие DBM-xeiueu

• Использование DBM-xema

• Базы данных произвольного доступа с записями фиксированной длины

• Базы данных с записями переменной длины (текстовые)

• Упражнения


Работа с пользовательскими базами данных

DBM-базы данных и DBM-xemu

в большинстве UNIX-систем есть стандартная библиотека, которая называется DBM. Эта библиотека представляет собой простую систему управления базами данных, которая позволяет программам записывать набор пар ключ-значение в пару файлов. В этих файлах хранятся значения базы данных в промежутках между вызовами программ, использующих ее, и эти программы могут вводить в базы данных новые значения, обновлять существующие и удалять старые.

Библиотека DBM довольно проста, но, учитывая ее доступность, некоторые системные программы активно используют эту библиотеку для своих довольно скромных нужд. Например, sendmail (а также ее варианты и производные) хранит базу данных aliases (соответствие адресов электронной почты и имен получателей) как DBM-базу данных. Самое популярное ПО телеконференций Usenet использует DBM-базу данных для хранения информации о текущих и недавно просмотренных статьях. Главные файлы базы данных Sun NIS (урожденной YP) также хранятся в формате DBM.

Perl обеспечивает доступ к такому же механизму DBM довольно умным способом: посредством процесса, похожего на открытие файла, с DBM-базой данных можно связать хеш. Этот хеш (называемый DBM-массивом) используется для доступа к DBM-базе данных и внесения в нее изменений.



Создание нового элемента в этом массиве влечет за собой немедленное изменение в базе данных. Удаление элемента приводит к удалению значения из DBM-базы данных и т.д.*

Размер, количество и вид ключей и значений в DBM-базе данных ограничены. В зависимости от того, какой версией библиотеки DBM вы пользуетесь, эти же ограничения могут иметь место и для DBM-массива. Подробности см. на тап-странице AnyDBMFile. В общем, если вы сумеете сделать так, чтобы и ключи, и значения упаковывались не больше чем в 1000 символов с произвольными двоичными значениями, то все будет нормально.

Открытие и закрытие DBM-хешей

Чтобы связать DBM-базу данных с DBM-массивом, применяется функция dbmopen, которая используется следующим образом:

dbmopen ( %ИМЯ МАССИВА, "имя ОВМ-файла", $режим)

Параметр %имя МАССИВА - это имя Perl-хеша. (Если в данном хеше уже есть значения, они выбрасываются.) Хеш соединяется с DBM-базой данных, заданной параметром имя овм-файла. Она обычно хранится на диске в виде пары файлов с именами имя ивм-файла.dir и имя ОВМ-файла.рад.

Параметр $режим - это число, которое соответствует битам прав доступа к названным двум файлам, если файлы создаются заново. Обычно оно указывается в восьмеричном формате; часто используемое значение 0 64 4 предоставляет право доступа только для чтения всем, кроме владельца, который имеет право на чтение и запись. Если эти файлы существуют, данный параметр не действует. Например:

dbmopen (*FR£D, "mydatabase", 0644); # открыть %FRED на mydatabase

Этот вызов связывает хеш %fred с файлами ту database.dir и mydata-base.pag, расположенными в текущем каталоге. Если эти файлы не существуют, они создаются с правами доступа 0644, которые модифицируются с учетом текущего значения, установленного командой umask.

Функция dbmopen возвращает значение "истина", если базу данных можно открыть или создать; в противном случае возвращается "ложь" - точно так же, как при вызове функции open. Если вы не хотите создавать файлы, используйте вместо параметра $режим значение undef. Например:

dbmopen(%А, "/etc/хх",undef) die "cannot open DBM /etc/хх";

Это, по сути дела, просто особый случай использования общего механизма tie. Если вам понадобится что-нибудь более гибкое, обратитесь к man-страницам AnyDBM File(3), DB Fik(3) и perltic(l).



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