Язык программирования Perl
Шрифт:
Таблица 7.2. Преобразования в формате sprintf
Преобразование | Синоним | Результат преобразования | Мнемоника символа |
---|---|---|---|
%% | Знак процента | % | |
%c | Символ с указанным номером в кодовой таблице | Character | |
%s | Строка | String | |
%d | %i | Целое со знаком в десятичном виде | Decimal, Integer |
%u | Целое без знака в десятичном виде | Unsigned | |
%b | Целое без знака
| Binary | |
%o | Целое без знака в восьмеричном виде | Octal | |
%x | %X | Целое без знака в шестнадцатеричном виде | heXadecimal |
%e | %E | Целое с плавающей точкой в научной нотации | Exponential |
%f | %F | Число с плавающей точкой в виде десятичной дроби | Float |
%g | %G | Число с плавающей точкой в формате %e или %f |
Между знаком процента и символом в указании преобразования можно использовать дополнительные параметры преобразования, основные из которых приведены в таблице 7.3.
Таблица 7.3. Параметры преобразования в формате sprintf
Параметр | Выполняемое форматирование | Пример параметров sprintf | Результат форматирования |
---|---|---|---|
число | Минимальная ширина поля вывода для результата преобразования; если она не задана или меньше ширины значения, то устанавливается равной ширине выводимого значения | '<%5s>', 25 | < 25> |
.число | Количество цифр после десятичной точки в дробном числе | '<%.5f>', 0.25 | <0.25000> |
Максимальная ширина поля вывода, до которой усекается длинная строка | '<%.5s>', '5' x 10 | <55555> | |
пробел | Вывод пробела перед положительным числом | '<% d>', 25 | '< 25>' |
+ | Вывод плюса перед положительным числом | '<%+d>', 25 | '<+25>' |
0 | Вывод нулей, а не пробелов при выравнивании по правому краю поля | '<%05s>', 25 | '<00025>' |
– | Выравнивание значения по левому краю поля | <%-5s>, 25 | '<25 >' |
# | Вывод перед восьмеричным числом 0, перед шестнадцатеричным числом 0x, перед двоичным числом 0b | '<%#x>',25 | '<0x19>' |
При выполнении sprintf к очередному значению из списка аргументов применяется преобразование, результат которого вставляется в форматирующую строку на место указания преобразования. Например, если шаблон форматирования и аргументы функции sprintf заданы так:
то после выполнения приведенного предложения в переменной $formatted_string будет содержаться такая отформатированная строка:
Преобразования в формате этого примера обозначают следующее:
[x]. %12s - преобразовать аргумент в строку (string) и поместить в поле шириной в 12 символов с выравниванием вправо (т. к. ширина поля положительная);
[x]. %03d - преобразовать аргумент в десятичное целое (decimal) и поместить в поле шириной в 3 цифры с ведущими нулями (т. к. ширина поля задана с ведущим нулем) и выравниванием вправо (поскольку ширина положительная);
[x]. %+-10.2f - преобразовать аргумент в дробное число (float) с явным знаком (т.к. указан +) и поместить в поле шириной в 10 цифр, из которых 2 отводятся на дробную часть, с выравниванием влево (поскольку ширина поля отрицательная).
Функция sprintf часто применяется для округления чисел - например, до трех знаков в дробной части:
Полное описание форматов с самыми разными примерами их употребления можно прочитать в официальной документации:
В дополнение к функции sprintf имеется функция printf, которая использует тот же самый формат преобразования, но выводит отформатированный результат в указанный выходной поток.
Иногда требуется работать не со строками и словами текста, а с его отдельными символами. В Perl есть необходимые средства работы с символами, хотя в нем нет специального типа данных, представляющих один символ, подобно типу char в других языках. Один символ из строки можно скопировать функцией substr($string, $index, 1).
С помощью заимствованных из языка Pascal функций ord и chr выполняются преобразования символа (а точнее односимвольной строки) в его ASCII-код и наоборот:
Разбить строку на отдельные символы и поместить их в массив можно с помощью уже знакомой функции split с пустой строкой в качестве разделителя:
С помощью списков и нескольких вызовов функции substr можно поменять в строке местами символы с указанными индексами, например, 1 и 11:
Известная по лекции о списках функция reverse в скалярном контексте возвращает значение текстового выражения, в котором символы переставлены в обратном порядке, например:
Обрабатывать отдельные байты, в том числе и символы, можно также при помощи функций pack и unpack, которые предназначены для преобразования любых данных и будут рассмотрены в лекции, посвященной вводу-выводу.
В современном мире уже не работает формула "один символ - это один байт". Необходимость представления текстов, одновременно содержащих символы разных естественных языков, привела к появлению ряда стандартов, часто объединяемых под общим названием Unicode и разработанных международным Консорциумом Unicode. Многочисленные национальные символы языков мира кодируются последовательностями из нескольких байтов. Unicode предлагает несколько форм представления символов в виде форматов преобразования Unicode (Unicode Transformation Format, UTF) и наборов символов Unicode (Unicode Character Set, UCS). Стандарты UCS-2 и UCS-4 представляют из себя кодировки фиксированной длины по два и четыре байта. Из кодировок переменной длины самым популярным стал стандарт UTF-8, использующий для кодирования одного символа от одного до шести байт. Начиная с версии 5.6, Perl поддерживает обработку символов в кодировках Unicode. В Perl применяется кодирование символов последовательностями чисел переменной длины на основе представления UTF-8. Есть возможность записывать многобайтовые (multi-byte) символы в виде литералов, а также выполнять ввод-вывод Unicode-символов.