KnigaRead.com/

Михаил Шохирев - Язык программирования Perl

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Михаил Шохирев, "Язык программирования Perl" бесплатно, без регистрации.
Перейти на страницу:

В Perl имеется несколько функций преобразования строкового представления числа в числовое значение. Функция hex() возвращает десятичное значение выражения, представленного как шестнадцатиричное число в виде строки:


$hexadecimal_as_string = '0x2F'; $decimal_number = hex($hexadecimal_as_string); # будет 47


Функция oct() возвращает десятичное значение строкового выражения, представляющего запись восьмеричного числа:


$octal_as_string = '0777'; $decimal_number = oct($octal_as_string); # будет 511


С помощью oct() можно также преобразовать к десятичному значению двоичное или шестнадцатиричное число, записанное в виде строки:


$binary_as_string = '0b011001'; $decimal_number = oct($binary_as_string); # будет 25 $hexadecimal_as_string = '0x19'; $decimal_number = oct($hexadecimal_as_string); # будет 25


Ну а строку, содержащую число в десятичной системе счисления, можно преобразовать к числу, поместив ее в числовой контекст:


$pi_as_string = '3.141592653'; # число Пи в виде строки $circle_length = 2 * $pi_as_string * $radius;


Функция sprintf() возвращает строку, которая сформирована в соответствии с правилами форматирования, заимствованными из языка C: на основе формата преобразования, заданного первым аргументом, в результирующую строку подставляются отформатированные значения из списка остальных аргументов функции. В общем виде вызов этой функции выглядит так: sprintf(ФОРМАТ, СПИСОК АРГУМЕНТОВ). В формате преобразования располагается любой текст, в котором могут присутствовать указания преобразования. Каждое указание начинается с символа процента (%) и заканчивается символом, определяющим преобразование. Основные преобразования приведены в таблице 7.2.

Таблица 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() заданы так:


$format = "'%12s' агента <%03d> = '%+-10.2f'"; @list = ('Температура', 7, 36.6); $formatted_string = sprintf($format, @list);


то после выполнения приведенного предложения в переменной $formatted_string будет содержаться такая отформатированная строка:


' Температура' агента <007> = '+36.60 '


Преобразования в формате этого примера обозначают следующее:

[x]. %12s - преобразовать аргумент в строку (string) и поместить в поле шириной в 12 символов с выравниванием вправо (т. к. ширина поля положительная);

[x]. %03d - преобразовать аргумент в десятичное целое (decimal) и поместить в поле шириной в 3 цифры с ведущими нулями (т. к. ширина поля задана с ведущим нулем) и выравниванием вправо (поскольку ширина положительная);

[x]. %+-10.2f - преобразовать аргумент в дробное число (float) с явным знаком (т.к. указан +) и поместить в поле шириной в 10 цифр, из которых 2 отводятся на дробную часть, с выравниванием влево (поскольку ширина поля отрицательная).

Функция sprintf() часто применяется для округления чисел - например, до трех знаков в дробной части:


$rounded = sprintf("%.3f", 7/3); # в $rounded будет 2.333


Полное описание форматов с самыми разными примерами их употребления можно прочитать в официальной документации:


perldoc -f sprintf


В дополнение к функции sprintf() имеется функция printf(), которая использует тот же самый формат преобразования, но выводит отформатированный результат в указанный выходной поток.

Иногда требуется работать не со строками и словами текста, а с его отдельными символами. В Perl есть необходимые средства работы с символами, хотя в нем нет специального типа данных, представляющих один символ, подобно типу char в других языках. Один символ из строки можно скопировать функцией substr($string, $index, 1).

С помощью заимствованных из языка Pascal функций ord() и chr() выполняются преобразования символа (а точнее односимвольной строки) в его ASCII-код и наоборот:


$code = ord($char); # ord('M') вернет число 77 $char = chr($code); # chr(77) вернет строку 'M' # синоним: $char = sprintf("%c", $code);


Разбить строку на отдельные символы и поместить их в массив можно с помощью уже знакомой функции split() с пустой строкой в качестве разделителя:


@array_of_char = split('', $string);


С помощью списков и нескольких вызовов функции substr() можно поменять в строке местами символы с указанными индексами, например, 1 и 11:


$s = 'кОт видел кИта'; (substr($s, 1, 1), substr($s, 11, 1)) = (substr($s, 11, 1), substr($s, 1, 1)); # в $s будет 'кИт видел кОта'


Известная по лекции о списках функция reverse() в скалярном контексте возвращает значение текстового выражения, в котором символы переставлены в обратном порядке, например:


$palindrom = 'А РОЗА УПАЛА НА ЛАПУ АЗОРА'; $backwards = reverse($palindrom); # в $backwards будет 'АРОЗА УПАЛ АН АЛАПУ АЗОР А'

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*