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

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

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

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

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

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

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

каталоги в алфавитном порядке? В предыдущей главе мы изучили функцию
sort, давайте воспользуемся ею:
setpwentO; # инициализировать просмотр
while (Glist = getpwent {)) { # выбрать следующий элемент
($login,$home) = @list[0,7J; # получить регистрационное имя
# и начальный каталог $home{$login} = $home; # сохранить их
}
endpwentO; # все сделано
@keys = sort { $home{$a} cmp $home{$b} } keys %home;
foreach $login (@keys) { # пройти по рассортированным именам
print "home of $login is $home{$login}\n";
}
Этот несколько более длинный фрагмент иллюстрирует важную особенность
последовательного просмотра файла паролей: вы можете сохранять
соответствующие фрагменты данных в структурах данных, выбираемых по
своему усмотрению. Первая часть примера - это код просмотра всего файла
паролей с созданием хеша, в котором ключ - регистрационное имя, а
значение - начальный каталог, соответствующий этому регистрационному
имени. Строка sort получает ключи хеша и сортирует их в соответствии со
строковым значением. Завершающий цикл - это проход по рассортированным
ключам и поочередный вывод всех значений.
В общем случае для просмотра небольшого количества значений рекомендуется
использовать программы произвольного доступа (getpwuid и getpwnam). Если
значений много или необходим просмотр всех значений, проще выполнить
проход с последовательным доступом (с помощью функций setpwent, getpwent
и endpwent) и поместить конкретные значения, которые вы будете искать, в
хеш*.
Доступ к файлу /etc/group осуществляется аналогичным образом.
Последовательный доступ обеспечивается вызовами функций setgrent,
getgrent и endgrent. Вызов getgrent возвращает значения в следующем
формате:
($name, $passwd, $gid, $members)
Эти четыре значения примерно соответствуют четырем полям файла
/etc/group, поэтому за подробной информацией обращайтесь к описаниям,
приведенным на man-страницах, относящихся к формату этого файла.
Соответствующие функции произвольного доступа - getgrgid (по
идентификатору группы) и getgrnam (по имени группы).
* Если у вас узел с большой N IS-картой, то по соображениям
производительности такой способ предобработки файла паролей лучше не
использовать
212
Изучаем Perl
Упаковка и распаковка двоичных данных
Данные о паролях и группах удобно использовать в текстовом виде.
Информацию в других системных базах данных более естественно представлять
иначе. Например, IP-адрес интерфейса обрабатывается внутренними
механизмами как четырехбайтовое число. Хотя его часто представляют в
текстовом виде (как четыре небольших целых числа, разделенных точками),
такое преобразование - пустая трата времени, если эти данные в промежутке
между преобразованиями не выводятся на экран пользователя.
По этой причине написанные на Perl сетевые программы, ожидающие или
возвращающие IP-адрес, используют четырехбайтовую строку, одному символу
которой соответстввует один байт в памяти. Хотя конструирование и
интерпретация такой байтовой строки - довольно простая задача, решаемая с
помощью функций chr и ord (здесь не представленных), в Perl используется
более эффективное решение, которое в равной степени применимо и к более
сложным структурам.
Функция pack по принципу работы немного похожа на функцию sprintf. Она
получает строку, задающую формат, и список значений и упаковывает
значения в одну строку. Однако в pack строка, задающая формат,
предназначена для создания двоичной структуры данных. Например, вот как
можно взять четыре небольших целых числа и упаковать их в виде
последовательности байтов без знака в строке:
$buf = pack("СССС", 140, 186, 65, 25);
Здесь строка формата pack - четыре буквы С. Каждая С соответствует
отдельному значению, взятому из приведенного следом списка (подобно тому,
что делает спецификация % в функции sprintf). Формат С (согласно шап-
страницам Perl, краткому справочнику, книге Programming Perl, HTML-файлам
и даже видеоролику Perl: The Motion Picture) обозначает один байт,
вычисляемый из символьного значения без знака (короткого целого). Строка-
результат в переменной $buf представляет собой четырехсимвольную строку,
в которой каждый символ задан одним байтом. Эти байты имеют значения 140,
186, 65 и 25 соответственно.
Аналогичным образом формат 1 генерирует длинное значение со знаком. На
многих машинах это четырехбайтовое число, хотя этот формат зависит от
конкретной машины. На четырехбайтовой "длинной" машине оператор
$buf = pack("Iй,0x41424344);
генерирует четырехсимвольную строку, состоящую из символов abcd или dcba
- в зависимости от того, какой порядок хранения байтов используется на
данной машине: "младший в младшем" или "старший в младшем" (либо что-то
совершенно иное, если эта машина "не говорит" на ASCII). Это объясняется
тем, что мы упаковываем одно значение в четыре символа (для представления
длинного целого отводится четыре байта), а это одно значение
16. Доступ к системным баяам данных
213
как раз состоит из байтов, представляющих коды ASCII первых четырех букв
Предыдущая << 1 .. 78 79 80 81 82 83 < 84 > 85 86 87 88 89 90 .. 124 >> Следующая