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

на главную - закладки

Жанры

Язык программирования 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);

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

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

Локки 4 Потомок бога

Решетов Евгений Валерьевич
4. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Локки 4 Потомок бога

Кодекс Охотника. Книга XXXV

Винокуров Юрий
35. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXV

Тринадцатый II

NikL
2. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый II

Бестужев. Служба Государевой Безопасности. Книга третья

Измайлов Сергей
3. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга третья

Непереводимое в переводе

Влахов Сергей
Научно-образовательная:
языкознание
5.00
рейтинг книги
Непереводимое в переводе

Курс 1. Октябрь

Фокс Гарри
2. Маркатис
Фантастика:
аниме
фэнтези
сказочная фантастика
5.00
рейтинг книги
Курс 1. Октябрь

Последний Паладин. Том 9

Саваровский Роман
9. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 9

Гусариум (сборник)

Русанов Владислав Адольфович
Фантастика:
альтернативная история
5.80
рейтинг книги
Гусариум (сборник)

Агенты ВКС

Вайс Александр
3. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Агенты ВКС

На границе империй. Том 7

INDIGO
7. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
6.75
рейтинг книги
На границе империй. Том 7

#Бояръ-Аниме. Газлайтер. Том 13

Володин Григорий Григорьевич
13. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
фэнтези
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 13

В теле пацана 6

Павлов Игорь Васильевич
6. Великое плато Вита
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
В теле пацана 6

Рубежник

Билик Дмитрий Александрович
1. Бедовый
Фантастика:
юмористическая фантастика
городское фэнтези
мистика
5.00
рейтинг книги
Рубежник

Память Света/Память огня (др. перевод)

Сандерсон Брендон
14. Колесо Времени
Фантастика:
фэнтези
7.50
рейтинг книги
Память Света/Память огня (др. перевод)