Чтение онлайн

на главную

Жанры

Язык программирования Perl
Шрифт:

my ($hh, $mm, $ss) = (localtime)[2, 1, 0];

# выбрать из списка нужные значения: часы, минуты, секунды

my $format = "%02d:%02d:%02d\n"; # формат вывода

printf $format, $hh, $mm, $ss; # вывод в STDOUT

printf(STDERR $format, $hh, $mm, $ss); # вывод в STDERR

printf $file $format, $hh, $mm, $ss; # вывод в $file

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

В файле с исходным текстом программы на Perl может располагаться

встроенный файл с данными, которые помещаются в конце программного файла после специальной лексемы __END__ (в основной программе) или __DATA__ (в программном модуле). При выполнении программы данные из этого встроенного файла доступны для чтения при помощи специального файлового манипулятора DATA. Во встроенном файле удобно хранить тестовые данные для проверки работы программы после ее модификации. Вот пример чтения данных из встроенного файла:

while (my $line = <DATA>) { # читаем построчно данные

print $line; # обрабатываем данные

}

__END__

Это данные из встроенного файла

Двоичные данные обычно хранятся в файлах без разделителей записей в блоках фиксированной длины. После открытия двоичного файла функцией 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. За каждым символом в шаблоне может следовать десятичное число, которое рассматривается как ширина преобразуемого поля. Поля в шаблоне могут разделяться пробелами для удобства чтения.

Таблица 9.2. Шаблоны упаковки и распаковки данных

Шаблон Мнемоника Описание преобразования
a Arbitrary произвольная последовательность байтов, дополненная нулевым байтом \0
A ASCII строка символов ASCII, дополненная пробелами
b / B Bit string строка битов с возрастающим / убывающим порядком битов
c / C Character однобайтовые символы со знаком / без знака
f / d Float / Double число с плавающей точкой одинарной / двойной точности
F Float число с плавающей точкой одинарной точности во внутреннем представлении (NV)
D long Double длинное число с плавающей точкой двойной точности
h / H Hex string шестнадцатеричная строка с младшим / старшим полубайтом (nybble) в начале
i / I Integer целое (>=32
бита) число со знаком / без знака
j / J целое во внутреннем представлении со знаком (IV) / без знака (UV)
l / L Long длинное (32 бита) целое со знаком / без знака
n / N Network беззнаковое короткое (16 битов) / длинное (32 бита) целое с сетевым порядком байтов (big endian)
p / P Pointer указатель на строку, оканчивающуюся \0 / фиксированной длины
q / Q Quad сверхдлинное (64 бита) целое число со знаком / без знака
s / S Short короткое (16 битов) целое со знаком / без знака
u uuencoded строка, кодированная по алгоритму uuencode
U Unicode строка символов Unicode
v / V VAX беззнаковое короткое (16 битов) / длинное (32 бита) целое с VAX-порядком байтов (little endian)
w целое, сжатое в соответствии с кодировкой BER
x вставка \0 (pack) / пропуск байта по направлению вперед (unpack)
X пропуск байта по направлению назад
Z ASCIIZ строка ASCIIZ (оканчивающаяся \0), дополненная \0
@ заполнение \0 до указанной позиции

Например, целочисленное значение, возвращаемое функцией 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);

Чтобы пропустить ненужные поля, достаточно указать в шаблоне пропуск определенного количества байтов. Например, так можно не извлекать поле с телефонным номером:

Поделиться:
Популярные книги

Решала

Иванов Дмитрий
10. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Решала

Все не случайно

Юнина Наталья
Любовные романы:
современные любовные романы
7.10
рейтинг книги
Все не случайно

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска

Неудержимый. Книга XIV

Боярский Андрей
14. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XIV

Жребий некроманта 3

Решетов Евгений Валерьевич
3. Жребий некроманта
Фантастика:
боевая фантастика
5.56
рейтинг книги
Жребий некроманта 3

Делегат

Астахов Евгений Евгеньевич
6. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Делегат

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

Real-Rpg. Еретик

Жгулёв Пётр Николаевич
2. Real-Rpg
Фантастика:
фэнтези
8.19
рейтинг книги
Real-Rpg. Еретик

Восход. Солнцев. Книга VI

Скабер Артемий
6. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга VI

Действуй, дядя Доктор!

Юнина Наталья
Любовные романы:
короткие любовные романы
6.83
рейтинг книги
Действуй, дядя Доктор!

Авиатор: назад в СССР 12

Дорин Михаил
12. Покоряя небо
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 12

Адепт. Том 1. Обучение

Бубела Олег Николаевич
6. Совсем не герой
Фантастика:
фэнтези
9.27
рейтинг книги
Адепт. Том 1. Обучение

Земная жена на экспорт

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Земная жена на экспорт

Варлорд

Астахов Евгений Евгеньевич
3. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Варлорд