Добрый день. Я сейчас прохожу курс повышения квалификации - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?
|
Средства ввода-вывода
Ввод-вывод двоичных данных
Двоичные данные обычно хранятся в файлах без разделителей записей в блоках фиксированной длины. После открытия двоичного файла функцией open() нужно установить режим обработки двоичных данных с помощью функции binmode().
open(my $fh, ">$file") or die("Ошибка открытия: $!"); binmode($fh);
Запись двоичных данных или данных фиксированной длины может выполняться с помощью функции print($fh $record). Также имеется функция небуферизованного вывода syswrite(), которой при вызове указываются три аргумента: файловый манипулятор, скалярная переменная с выводимыми данными и размер записываемого блока данных. Эта функция возвращает число фактически записанных байт (в случае ошибки syswrite возвращает undef ), что можно использовать для проверки успешности записи. Это делается так:
syswrite($fh, $record, length($record)) == length($record) or die("Ошибка записи: $!");
Преобразование данных к двоичному виду производит функция pack(), которая упаковывает в скалярную переменную список значений в соответствии с указанным шаблоном. В шаблоне каждое преобразуемое поле обозначается с помощью латинской буквы. Полный перечень шаблонов преобразования для функций pack() и unpack() приводится в таблице 9.2. За каждым символом в шаблоне может следовать десятичное число, которое рассматривается как ширина преобразуемого поля. Поля в шаблоне могут разделяться пробелами для удобства чтения.
Например, целочисленное значение, возвращаемое функцией time(), и дробное значение, возвращаемое функцией rand(), можно упаковать в переменную $record с помощью шаблона 'l1 d1', который означает: "одно длинное целое число (long) и одно число с плавающей точкой двойной точности (double)".
$record = pack 'l1 d1', time(), rand(); #
Вот еще несколько несложных примеров использования разных шаблонов для функции pack():
$bin = pack('a5', 'Yes'); # в $bin будет: 'Yes\0\0' $bin = pack('A5', 'Yes'); # в $bin будет: 'Yes ' $bin = pack('a4', 'abcd','x','y','z'); # в $bin: 'abcd' $bin = pack('aaaa', 'abcd','x','y','z'); # в $bin: 'axyz' $bin = pack('C2', 65,66,67); # в $bin будет: 'AB' $bin = pack('U2', 0x263A, 0x263B); # в $bin будет: '??' $bin = pack ('cxxc', 65,66); # в $bin будет: 'A\0\0B'
Для преобразования данных из двоичного вида применяется функция unpack(), которая распаковывает из скалярной переменной в список или массив значения двоичных данных в соответствии с указанным шаблоном.
@list_of_values = unpack($template, $binary_record);
Кроме того, с помощью функции unpack() можно из строки извлекать подстроки фиксированной длины. Например, так можно извлечь из записи файла поля определенной длины в переменные:
# Поля данных в записи файла: # c 1 по 7 байт - номер телефона # с 8 длиной 30 - фамилия, имя, отчество абонента # с 38 длиной 25 - адрес # 1234567Бендер Остап Ибрагимович РСФСР, Черноморск ($phone, $name, $address)= unpack('A7A30A25', $record);
Чтобы пропустить ненужные поля, достаточно указать в шаблоне пропуск определенного количества байтов. Например, так можно не извлекать поле с телефонным номером:
($name, $address)= unpack('x7A30A25', $record);
Подробное описание шаблонов и работы функций pack() и unpack() можно найти в стандартной документации с помощью все той же утилиты чтения документации:
perldoc perlpacktut
Для чтения двоичных данных или текстовых данных фиксированной длины применяется функция read(), которой в качестве аргументов передаются файловый манипулятор, скалярная переменная для вводимых данных и размер считываемого блока данных. Вот так, например, выглядит типичный цикл чтения двоичных данных:
until(eof($fh)) { # читать до достижения конца файла # считать очередной блок данных и проверить его длину read($fh, $record, $record_size) == $record_size or die('Неправильная длина данных'); # распаковать данные по шаблону из $record в @data @data = unpack($template, $record); # обработать введенные данные... }