Функции для работы со строками
Функция lcfirst() возвращает значение строкового выражения, в котором только первый символ преобразован к нижнему регистру, например:
$first_char_lower = lcfirst($text); # 'Perl' станет 'perl'
К верхнему регистру ( upper case ) преобразовать текст можно с помощью функции uc(), которая возвращает значениесимвольного выражения, преобразованное к заглавным буквам.
use locale;
$upper_case = uc($text); # преобразовать к большим буквам
Функция ucfirst() возвращает значение строкового выражения, в котором только первый символ преобразован к верхнему регистру. Так, например, можно записать имя собственное с заглавной буквы:
$capitalized = ucfirst($name); # 'ларри' станет 'Ларри'
Встроенная функция crypt() выполняет шифрование строки, переданной ей в качестве аргумента, используя второй аргумент в качестве "затравки" (salt) для шифрования:
# незашифрованная строка из $plain шифруется в $crypted
$crypted = crypt($plain, $salt);
Эта функция не имеет парной расшифровывающей функции и чаще всего используется для сравнения открытого текста с существующей зашифрованной строкой, как это делается в следующем примере:
if (crypt($plain, $salt) eq $crypted) {
# открытый текст совпал с зашифрованным
}
Функция quotemeta() находит в символьном выражении метасимволы (о которых пойдет речь в следующей лекции) или escape-последовательности и возвращает строку, где у всех специальных символов отменено их особое значение: для этого перед каждым из них ставится символ обратной косой черты '\'.
$string_with_meta = '\n \032 \x00 text \t \v "';
$quoted = quotemeta($string_with_meta);
# в $quoted будет '\\n\ \\032\ \\x00\ text\ \\t\ \\v\ \"'
В 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 '
Преобразования в формате этого примера обозначают следующее:
- %12s - преобразовать аргумент в строку (string) и поместить в поле шириной в 12 символов с выравниванием вправо (т. к. ширина поля положительная);
- %03d - преобразовать аргумент в десятичное целое (decimal) и поместить в поле шириной в 3 цифры с ведущими нулями (т. к. ширина поля задана с ведущим нулем) и выравниванием вправо (поскольку ширина положительная);
- %+-10.2f - преобразовать аргумент в дробное число (float) с явным знаком (т.к. указан +) и поместить в поле шириной в 10 цифр, из которых 2 отводятся на дробную часть, с выравниванием влево (поскольку ширина поля отрицательная).
Функция sprintf() часто применяется для округления чисел - например, до трех знаков в дробной части:
$rounded = sprintf("%.3f", 7/3); # в $rounded будет 2.333
Полное описание форматов с самыми разными примерами их употребления можно прочитать в официальной документации:
В дополнение к функции 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 будет 'АРОЗА УПАЛ АН АЛАПУ АЗОР А'
Обрабатывать отдельные байты, в том числе и символы, можно также при помощи функций pack() и unpack(), которые предназначены для преобразования любых данных и будут рассмотрены в лекции, посвященной вводу-выводу.
|