Учебные материалы по математике | Perl — функция unpack для распаковки | Matematiku5
Вузы по математике Готовые работы по математике Как писать работы по математике Примеры решения задач по математике Решить задачу по математике online

Perl — функция unpack для распаковки


2. Функция unpack для распаковки.

Получает:

—  строка формата;

—  строка данных;

Выдает:

—  список значений, что хранятся в соответствующих ячейках

памяти.

Предположим, что нам дали восьмибайтовую строку ABCDEFGH и сказали, что она является представлением (один символ – один байт) хранящихся в памяти двух длинных (четырехбайтовых) значений со знаком.

($val1,$val2)=unpack ("ll","ABCDEFGH");

$val1 будет равна 0x41424344 или 0x44434241

Этим примером можно определит, как байты идут в памяти компьютера:

—  "младший в младшем" или

—  "старший в старшем".

3.Способы задания формата.

—  "СССС"

—  "С4" — эквивалентны

—  "С2С2"

В записях формата пробелы игнорируются,они применяются только для удобства чтения).

— С* — повторное применение формата. Здесь * задает повторное применение формата до тех пор, пока не отработана остальная часть списка значений (для упаковки) или пока не создана остальная часть строки, содержащей двоичное представление (для распаковки)

Приведем еще один способ упаковки четырехсимвольных символов без знака в строку.

а) $buf=pack("C*",140,168,65,25);

б) $buf=pack("s2C*",3141,5926,5,3,5,8,9,7,3);

s2 – два коротких целых;

С* — максимальное количество символов без знака.

Функция unpack и формат со * могут формировать список элементов, длина которых заранее не определена.

@values=unpack("C*", "hello, world!n");

@values будет из 14 элементов, по одному на каждый символ. 14 – так как здесь происходит учет пробела и символа новой строки.

Возвращаемся к примеру (***).

Получив данные $buf с помощью read, можно разбить их на компоненты:

($f1,$f2,$f3,$f4)=unpack("A40 A A40 S",$buf);

Как видно форматы в pack и unpack часто одинаковы. Так как форматы одинаковы, то их заносят в переменные:

$name="A40 A A40 S";

Максимальную длину записи можно определять так:

$name_len=length(pack($name)); => выдано 83.

Базы с записями переменной длины

Для программного редактирования используют:

—  операцию "ромб",

—  переменную $^I со значением ≠undef.

Тогда "ромб" делает следующие шаги:

а) $argv=shift @ARGV; # переменная $argv принимает

# первое имя файла из массива

# @ARGV. Причем массив @ARGV

# уменьшается на единицу.

б) open (ARGV,"<$argv"); # открытие дескриптора файла с

# именем, что находится в

# переменной $argv

в) rename ($argv, "$argv$^I");# файл с именем в $argv

# переименовывается на имя $argv с

# другим расширением

г) unlink ($argv); # удаляется файл с именем $argv

д) open (ARGVOUT,">$argv");

е) select (ARGVOUT); # перезначение дескриптора файла

# для вывода

В результате в "ромб" при чтении — старый файл, а при записи — новая копия этого файла. Старый файл – в резервной копии с расширением что в переменной $^I. Часто $^I=.bak. Права доступа копируются. Если $^I="", то старый файл – удаляется!

CGI – программирование

Разработка и кодирование программ для обработки данных форм HTML-страниц.

Эти программы всегда находятся на сервере.

Прохождение информации:

1.  Пользователь запрашивает форму и вводит данные в нее.

2.  Броузер передает данные на сервер в спецификации CGI, основанной на протоколе HTTP.

3.  Сервер передает данные в CGI-script.

4.  Обработка данных и формирование ответа (применяется спецификация CGI) передает ответ серверу (HTTP).

5.  Сервер передает данные броузеру пользователя.

Все данные в CGI-script проходят через хеш %ENV, который:

—  инициализируются Perlом;

—  элементы хеша доступны, когда запускается скрипт;

—  доступ как к элементам хеша. Эти элементы можно модифицировать, но изменения учитываются только на данный сеанс вызова скрипта и на другие программы не влияют.

Пример. Вывод элементов массива %ENV

#!/usr/local/bin/perl

print "Content_type: text|htmlnn";

# вывод заголовка по протоколу MIME:

—  что передается информация в виде HTML-документа;

—  в конце обязательно два символа новой строки, которые формируют пустую строку. Это признак того, что заголовок перданных данных закончился и дальше идет сами данные.

print "<HTML>n";

print "<HEAD><TITLE> Переменные окружения </TITLE></HEAD>n";

print "<BODY BGCOLOR="FF0011">n";

# Так как код цвета должен быть в кавычках, то мы ставим

# обратный слещ, чтобы код кавычек считался обычным символом

# двойных кавычек.

print "<center><h1> Переменные окружения </h1></center><p>n";

foreach $variab (sort keys %ENV)

# Цикл прохода по ключам хеша и печать наименования

# переменных окружения и их значений.

{ print "$variab= $ENV{$variab}<BR>n";

}

print "</BODY></HTML>n";

Содержимое %ENV зависит от способа вызова и от формы. Вызоы можно сделать по ссылке, то-есть по нажатию клавиши "submit" в форме или путем ввода в URL адреса скрипта.

Пример CGI-скрипта для разбора данных форм.

#!/usr/local/bin/perl

$method=$ENV{"REQUEST_METHOD"};

$type=$ENV{"CONTENT_TYPE"};

if ($type eq "application/x-www-form-urlencoded")

&& ($method EQ "POST")

# Проверяем MIME-тип содержимого данных формы из запроса по

# методу POST. По умолчанию он будет

# "application/x-www-form-urlencoded".

{

read (STDIN, $input, $ENV{"CONTENT_LENGTH"});

}

elsif ($method EQ "GET")

{ $input=$ENV{"QUERY_STRING"}

}

else

{ … Выдача сообщения об ошибке;

Выход;

};

@form_names=split(‘&’,$input); # Разбиваем весь входной

# поток на маасив пар

# имя/значение. Каждая пара

# отделена от другой

# символом "&".

foreach $i (@form_names) # Разбиваем массив на хеш,

# где ключом будет имя, а

# значением – значение поля

# формы. Все будем заносить

# в хеш %in-values.

{ ($name,$value)=split(‘=’,$i); # Преобразование 16-ричных

# цифр в символы:

$value=~tr/+/ /; # Замена "+" на " ", так как

# когда в поле текста

# передавалась строка, то в

# ней все пробелы были

# заменены знаком "+".

# Теперь мы должны сделать

# обратное преобразование.

$value=~s/x([da-fA-F][da-fA-F])/pack("C",hex($1))/eg;

# Все закодированные символы (русские буквы, управляющие

# символы) также были переданы закодированными. Теперь мы их

# должны раскодировать. Опция g означает глобальную замену в

# строке, а опция e – вычисление заменяющей строки в операциях

# замены как Perl-выражение.

$in_values {$name}=$value ; # Формирование хеша для

# входных данных

# Формирование ответа как в

# предыдущем примере, только

# вместо хеша %ENV

# хеш %in-values.

}

Модуль CGI. pm

Мы все в этом примере сделали напрямую. Сейчас есть модуль CGI. pm (автор Линкольн Штейн), который в настоящее время стал стандартом и входит в поставку вместе с Perl. Этот модуль может:

—  производит разбор входящего запроса;

—  автоматически учитывает метод передачи данных и производит считывание;

—  осуществляет помощь в формировании ответа.

Для вставки данного модуля нужно:

use CGI; # Это надо поместить в начале

# программы

Имена всех Perl-модулей имеют расширение .pm

Имена необходимых функций нужно занести в список после имя CGI!

Нам будет нужна функция param():

—  если она без параметров, то она возвращает список всех полей формы;

—  если указан параметр, то возвращает значение (или значения) по этому полю.

Пример:

use CGI qw(param); # Здесь используется функция qw, так как

# может быть использован большой список.

print << Beg_1;

# Здесь применен аргумент << в функции print. Этот аргумент

# состоит из символов << и обязательной конечной лекскмы ";".

# Это просто удобный способ взятия в кавычки строкового значения

# из нескольких строк. Это строковое значение начинается на

# следующей строке и идет до тех пор, пока не дойдет до строки с

# одной конечной лексемой в строке и ничего больше.

Content_type: text/html

# Здесь обязательно должна быть пустая строка

<html><head><title>Пример</title></head><body><h1>Пример 2 </h1>

Beg_1

my($value)= param("name1"); # Если указан аргумент в

# функции param(), который

# обозначает имя поля, то

# param() возвращает

# значение или значения,

# связанные с этим полем.

Наташа

Автор

Наташа — контент-маркетолог и блогер, но все это не мешает ей оставаться адекватным человеком. Верит во все цвета радуги и не верит в теорию всемирного заговора. Увлекается «нефрохиромантией» и тайно мечтает воссоздать дома Александрийскую библиотеку.

Распродажа дипломных

 Скидка 30% по промокоду Diplom2020

А ты боишься COVID-19?

 Пройди опрос и получи промокод