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

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

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

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

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

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

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

алфавита. Аналогичным образом,
$buf = packC'll", 0x41424344, 0x45464748);
создает восьмибайтовую строку, состоящую из букв abcdefgh или dcbahgfe,
опять-таки в зависимости от того, какой порядок хранения байтов
используется в данной машине - "младший в младшем" или "старший в
младшем".
Полный перечень различных форматов, используемых для упаковки, приведен в
справочной документации (perlfunc(l) или Programming Perl). Мы приведем
некоторые из них как примеры, но все, конечно, давать не будем.
Допустим, вам дали восьмибайтовую строку abcdefgh и сказали, что она
является представлением хранящихся в памяти (один символ - один байт)
двух длинных (четырехбайтовых) значений со знаком. Как ее
интерпретировать? Нужно воспользоваться функцией, обратной функции pack,-
функцией unpack. Она берет строку управления форматом (как правило,
идентичную той, которую вы указывали в функции pack) и строку данных и
возвращает список значений, которые хранятся в соответствующих ячейках
памяти. Давайте, например, распакуем такую строку:
($vall,$val2) = unpack("11","ABCDEFGH");
Это даст нам в переменной $vall нечто вроде 0x41424344, а может быть, и
0x4 44 3 4241 (в зависимости от порядка хранения байтов). По сути дела,
по возвращаемым значениям мы можем определить, на какой машине работаем -
с порядком "младший в младшем" или "старший в младшем".
Пробельные символы в строке, задающей формат, игнорируются и используются
лишь для удобочитаемости. Число в этой строке, как правило, задает
повторение предыдущей спецификации соответствующее количество раз.
Например, СССС можно записать как С4 или С2С2, смысл от этого не
изменится. (Однако в некоторых спецификациях число, указанное после
символа, задающего формат, является частью спецификации, поэтому их
подобным образом записывать нельзя.)
После символа формата может стоять также звездочка, которая задает
повторное применение данного формата до тех пор, пока не обработана
остальная часть списка значений или пока не создана остальная часть
строки, содержащей двоичное представление (в зависимости от того, что
выполняется - упаковка или распаковка). Вот еще один способ упаковки
четырех символов без знака в одну строку:
$buf = pack("C*", 140, 186, 65, 25);
Здесь указанные четыре значения полностью обрабатываются одной
спецификацией формата. Если бы вам требовались два коротких целых и
"максимально возможное количество символов без знака", то можно было бы
написать примерно так:
$buf = pack("s2 С*", 3141, 5926, 5, 3, 5, 8, 9, 7, 9, 3, 2);
214
Научаем Perl
Здесь мы получаем первые два значения как короткие (и генерируем,
вероятно, четыре или восемь символов), а остальные девять - как символы
без знака (и генерируем, почти наверняка, девять символов).
Функция unpack со звездочкой в качестве спецификации может формировать
список элементов, длина которых заранее не определена. Например, при
распаковке с использованием формата с* создается один элемент списка
(число) для каждого символа строки. Так, оператор
Gvalues = unpack("С*м, "hello, world!\пи);
позволяет сформировать список из 14 элементов, по одному для каждого
символа строки.
Получение информации о сети
Perl поддерживает сетевое программирование средствами, которые хорошо
знакомы тем, кто писал программы для сетевых приложений на С. По сути
дела, большинство функций Perl, обеспечивающих доступ к сети, имеют и те
же имена, что их С-коллеги, и похожие параметры. В этой главе мы не можем
привести полную информацию по сетевому программированию, поэтому просто
рассмотрим фрагмент сетевого приложения.
Один из параметров, который вам приходится часто определять,- это IP-
адрес, соответствующий сетевому имени (или наоборот). В С вы преобразуете
сетевое имя в сетевой адрес с помощью программы gethostbyname(3). Затем,
используя полученный адрес, вы устанавливаете связь между своей
программой и другой программой, которая работает где-то в другом месте.
В Perl функция, преобразующая хост-имя в адрес, имеет то же имя, что и С-
программа, и похожие параметры. Выглядит она так:
($name, $aliases, $addrtype, $length, Gaddrs) = gethostbyname($name);
# основная форма функции gethostbyname
Параметр этой функции - имя хоста, например, slate.bedrock.com, а
возвращаемое значение - список из четырех и более параметров (в
зависимости от того, сколько адресов связано с данным именем). Если имя
хоста недействительно, функция возвращает пустой список.
Когда gethostbyname вызывается в скалярном контексте, возвращается только
первый адрес.
Если gethostbyname завершается успешно, то переменной $name в качестве
значения присваивается каноническое имя, которое, если входное имя -
псевдоним, отличается от входного имени. Значение переменной $aliases -
это список разделенных пробелами имен, под которыми данный хост известен
в сети. Переменная $addrtype содержит кодовое обозначение формата
представления адреса. Для имени slate.bedrock.com мы можем предположить,
Предыдущая << 1 .. 79 80 81 82 83 84 < 85 > 86 87 88 89 90 91 .. 124 >> Следующая