Глава 6.9. Встроенные функции

В этой и следующих главах описаны все встроенные функции языка PERL, которые поддерживаются и в Unix, и в Windows. Для удобства пользования мы разбили их на следующие группы:

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

6.9.1. Числовые функции

Функция Описание
abs Абсолютная величина числа.
atan2 Арктангенс частного.
cos Косинус числа.
exp Экспонента числа.
int Целая часть числа.
log Натуральный логарифм числа.
rand Генератор случайных чисел.
sin Синус числа.
sqrt Квадратный корень из числа.
srand Инициализация генератора случайных чисел.

Функция abs

Синтаксис: abs число
Аргументы: число — числовое выражение
Результат: числовое значение

Функция abs возвращает абсолютную величину числа. Если аргумент опущен, то число принимается равным значению переменной $_. Примеры:

print abs 2;	// 2
print abs -2;	// 2

Функция atan2

Синтаксис: atan2 число1, число2
Аргументы: число1, число2 — числовые выражения
Результат: числовое значение

Функция atan2 возвращает арктангенс частного от деления числа1 на число2. Результат находится в диапазоне от -π до +π и соответствует величине угла в радианах между осью абсцисс и вектором до точки с координатами (число2, число1). Примеры:

$x = atan2 -0, -1;	# x равно -3.14159265358979
$x = atan2 -1, 0;	# x равно -1.5707963267949
$x = atan2 0, 1;	# x равно 0
$x = atan2 1, 1;	# x равно 0.785398163397448
$x = atan2 1, 0;	# x равно 1.5707963267949
$x = atan2 0, -1;	# x равно 3.14159265358979

Функция cos

Синтаксис: cos число
Аргументы: число — числовое выражение
Результат: числовое значение

Функция cos возвращает косинус числа. Если аргумент опущен, то число принимается равным значению переменной $_. Примеры:

$pi = atan2 0, -1;
$x = cos 0;     # x равно 1
$x = cos $pi/2; # x равно 6e-17 (почти 0)
$x = cos $pi;   # x равно -1

Функция exp

Синтаксис: exp число
Аргументы: число — числовое выражение
Результат: числовое значение

Функция exp возвращает экспоненту числа. Если аргумент опущен, то число принимается равным значению переменной $_. Если число больше 709.78, то возвращается 1.#INF. Пример:

print exp 1;  # 2.71828182845905

Функция int

Синтаксис: int число
Аргументы: число — числовое выражение
Результат: числовое значение

Функция int возвращает целую часть числа. Если аргумент опущен, то число принимается равным значению переменной $_. Пример:

print int 1.5;   # 1
print int -1.5;  # -1

Функция log

Синтаксис: log число
Аргументы: число — числовое выражение
Результат: числовое значение

Функция log возвращает натуральный логарифм числа. Если аргумент опущен, то число принимается равным значению переменной $_. Если аргумент меньше или равен нулю, то возникает фатальная ошибка исполнения. Пример:

print log 2.71828182845905; # 1

Функция rand

Синтаксис: rand число
Аргументы: число — числовое выражение
Результат: числовое значение

Функция rand возвращает случайное число, большее или равное нулю и меньшее числа, которое должно быть положительным. Если аргумент опущен, то число принимается равным 1. Если функция srand() еще не вызывалась, то автоматически вызывает ее.

Функция sin

Синтаксис: sin число
Аргументы: число — числовое выражение
Результат: числовое значение

Функция sin возвращает синус числа. Если аргумент опущен, то число принимается равным значению переменной $_. Примеры:

$pi = atan2 0, -1;
$x = sin 0;      # x равно 0
$x = sin $pi/2;  # x равно 1
$x = sin -$pi/2; # x равно -1

Функция sqrt

Синтаксис: sqrt число
Аргументы: число — числовое выражение
Результат: числовое значение

Функция sqrt возвращает квадратный корень из числа. Если аргумент опущен, то число принимается равным значению переменной $_. Если аргумент меньше или равен нулю, то возникает фатальная ошибка исполнения. Пример:

print sqrt 2; # 1.4142135623731

Функция srand

Синтаксис: srand число
Аргументы: число — числовое выражение

Функция srand инициализирует генератор случайных чисел rand(). Если ее аргумент опущен, то число генерируется исполняющей системой. Начиная с PERL 5.004, явный вызов этой функции не нужен, т. к. теперь она автоматически вызывается функцией rand() при первом обращении к ней.

6.9.2. Строковые функции

Функция Описание
chomp Удаляет концевой разделитель записей.
chop Удаляет последний символ строки.
crypt Кодирует текст.
index Возвращает первую слева позицию заданной подстроки.
lc Преобразует строку в строчные буквы.
lcfirst Преобразует первый символ строки в строчную букву.
length Возвращает длину строки.
rindex Возвращает первую справа позицию заданной подстроки.
substr Возвращает заданную подстроку.
uc Преобразует строку в прописные буквы.
ucfirst Преобразует первый символ строки в прописную букву.

Функция chomp

Синтаксис: chomp строка
           chomp список
Аргументы: строка — строковое выражение
           список — список строковых выражений
Результат: числовое значение

Функция chomp удаляет из строки концевую подстроку, соответствующую текущему разделителю записей, т. е. содержимому переменной $/. Если аргументом является список, то эта функция применяется к каждому элементу списка. Если аргумент опущен, то строка принимается равной значению переменной $_. Результатом функции является общее количество удаленных символов.

Ее основным применением является удаление концевых символов перевода строки при построчном чтении текстового файла, например:

while (<>) {
  chomp;  # удаляем \n в конце считанной строки $_
  . . .
}

Если $\ равно undef или содержит ссылку на число (для записей фиксированной длины), то эта функция ничего не удаляет.

Функция chop

Синтаксис: chop строка
           chop список
Аргументы: строка — строковое выражение
           список — список строковых выражений
Результат: строковое значение

Функция chop удаляет из строки ее последний символ и возвращает его. Если аргументом является список, то эта функция применяется к каждому элементу списка и возвращает последний из удаленных символов. Если аргумент опущен, то строка принимается равной значению переменной $_. Пример:

$_ = 'abcde';
chop;
print; # выводит 'abcd'

Функция crypt

Синтаксис: crypt строка, код
Аргументы: строка, код — строковые выражения
Результат: строковое значение

Функция crypt кодирует исходную строку с помощью строки код и возвращает результат. Код должен состоять из двух символов, лежащих в диапазоне [./0-9A-Za-z]. Парной функции декодировки в PERL'е нет, поэтому практического применения эта функция не имеет.

Функция index

Синтаксис: index строка, подстрока, позиция?
Аргументы: строка, подстрока — строковые выражения
           позиция — числовое выражение
Результат: числовое значение

Функция index ищет в строке заданную подстроку, начиная с заданной позиции или с начала строки, если позиция опущена. Она возвращает позицию найденной подстроки в исходной строке или -1, если подстрока не найдена. Пример:

$str = 'Queen Mary';
print index($str, 'Mary');  # 6
print index($str, 'mary');  # -1

Функция lc

Синтаксис: lc строка
Аргументы: строка — строковое выражение
Результат: строковое значение

Функция lc преобразует все символы строки в строчные буквы. Если аргумент опущен, то строка принимается равной значению переменной $_. Если использована директива use locale, то преобразование производится с учетом текущей национальной настройки. Пример:

print lc 'ABCDE';  # abcde

Функция lcfirst

Синтаксис: lcfirst строка
Аргументы: строка — строковое выражение
Результат: строковое значение

Функция lcfirst преобразует первый символ строки в строчную букву. Если аргумент опущен, то строка принимается равной значению переменной $_. Если использована директива use locale, то преобразование производится с учетом текущей национальной настройки. Пример:

print lcfirst 'ABCDE';  # aBCDE

Функция length

Синтаксис: length строка
Аргументы: строка — строковое выражение
Результат: числовое значение

Функция length возвращает количество символов в строке. Если аргумент опущен, то строка принимается равной значению переменной $_. Пример:

print length 'ABCDE';  # 5

Функция rindex

Синтаксис: rindex строка, подстрока, позиция?
Аргументы: строка, подстрока — строковые выражения
           позиция — числовое выражение
Результат: числовое значение

Функция rindex ищет в строке заданную подстроку справа налево, начиная с заданной позиции или с конца строки, если позиция опущена. Она возвращает позицию найденной подстроки в исходной строке или -1, если подстрока не найдена. Пример:

print rindex('abcabc', 'abc');  # 3

Функция substr

Синтаксис: substr строка, смещение, длина?, замена?
Аргументы: строка, замена — строковые выражения
           смещение, длина — числовые выражения
Результат: строковое значение

Функция substr возвращает подстроку строки заданной длины, начиная с заданного смещения. Если смещение отрицательно, то оно отсчитывается от конца строки. Если длина опущена, то извлекаются символы до конца строки; если она отрицательна, то она складывается с длиной строки. Пример:

print substr('abcdef', 1, -2);  # bcd

Если строка задана переменной, то эта функция может иметь четвертый аргумент, который задает строку, на которую заменяется заданная подстрока, например:

$str = 'abcdef';
substr($str, 1, -2,'xxx');
print $str; # axxxef

Этот пример можно записать и так:

$str = 'abcdef';
substr($str, 1, -2) = 'xxx';
print $str; # axxxef

Функция uc

Синтаксис: uc строка
Аргументы: строка — строковое выражение
Результат: строковое значение

Функция uc преобразует все символы строки в прописные буквы. Если аргумент опущен, то строка принимается равной значению переменной $_. Если использована директива use locale, то преобразование производится с учетом текущей национальной настройки. Пример:

print uc 'abcde';  # ABCDE

Функция ucfirst

Синтаксис: ucfirst строка
Аргументы: строка — строковое выражение
Результат: строковое значение

Функция ucfirst преобразует первый символ строки в прописную букву. Если аргумент опущен, то строка принимается равной значению переменной $_. Если использована директива use locale, то преобразование производится с учетом текущей национальной настройки. Пример:

print ucfirst 'abcde';  # Abcde

6.9.3. Прочие скалярные функции

Функция Описание
chr Преобразует число в символ.
hex Преобразует строку в шестнадцатеричное число.
oct Преобразует строку в восьмеричное число.
ord Преобразует символ в число.
pack Упаковывает список значений в строку.
unpack Распаковывает строку в список значений.
vec Операции со строкой как как массивом из групп битов.

Функция chr

Синтаксис: chr код
Аргументы: код — числовое выражение
Результат: строковое значение

Функция chr возвращает символ, имеющий заданный числовой код. Если аргумент опущен, то код принимается равным значению переменной $_. Пример:

print chr 65;	// A

Функция hex

Синтаксис: hex строка
Аргументы: строка — строковое выражение
Результат: числовое значение

Функция hex преобразует строку в шестнадцатеричное число. Если аргумент опущен, то строка принимается равной значению переменной $_. Например, все приведенные ниже операторы выведут на экран число 165:

print hex '0xaf';
print hex 'xaf';
print hex '0af';
print hex 'af';

Функция oct

Синтаксис: oct строка
Аргументы: строка — строковое выражение
Результат: числовое значение

Функция oct преобразует строку в число. Если строка начинается с '0x', то она интерпретируется как шестнадцатеричное число; если она начинается с '0b', то интерпретируется как двоичное число; в остальных случаях она интерпретируется как восьмеричное число. Если аргумент опущен, то строка принимается равной значению переменной $_. Примеры:

print oct '0xaf';  # 165
print oct '0b101'; # 5
print oct '0100';  # 64
print oct '100';   #64

Функция ord

Синтаксис: ord строка
Аргументы: строка — строковое выражение
Результат: числовое значение

Функция ord возвращает числовой код первого символа строки. Если аргумент опущен, то строка принимается равной значению переменной $_. Пример:

print ord 'ABC';  # 65

Функция pack

Синтаксис: pack шаблон, список
Аргументы: шаблон — строковое выражение
           список — список скалярных выражений
Результат: строковое значение

Функция pack упаковывает заданный список значений в строку и возвращает его в качестве результата. Правила упаковки задаются строкой шаблон, которая состоит из символов, указывающих правила преобразования для элементов списка. Шаблон может содержать следующие символы:

Символ Результат
a Произвольная строка, в конце добавить нулевой байт.
A Строка ASCII, в конце добавить пробел.
Z Строка ASCII, в конце добавить нулевой байт.
b Битовая строка, биты в байте упаковываются с младшего бита.
B Битовая строка, биты в байте упаковываются со старшего бита.
h Шестнадцатеричная строка, младшая тетрада идет первой.
H Шестнадцатеричная строка, старшая тетрада идет первой.
c Однобайтовое целое со знаком.
C Однобайтовое целое без знака.
s Двухбайтовое целое со знаком.
S Двухбайтовое целое без знака.
i Целое со знаком (число байтов зависит от архитектуры).
I Целое без знака (число байтов зависит от архитектуры).
l Четырехбайтовое целое со знаком.
L Четырехбайтовое целое без знака.
n Двухбайтовое целое без знака, старший байт идет первым.
N Четырехбайтовое целое без знака, старший байт идет первым.
v Двухбайтовое целое без знака, младший байт идет первым.
V Четырехбайтовое целое без знака, младший байт идет первым.
q Восьмибайтовое целое со знаком.
Q Восьмибайтовое целое без знака.
f Плавающее число обычной точности, формат зависит от архитектуры.
d Плавающее число двойной точности, формат зависит от архитектуры.
p Указатель на строку с завершающим нулевым байтом.
P Указатель на структуру фиксированной длины.
u Строка в кодировке uuencode.
U Строка в кодировке UTF-8.
w Сжатое целое формата BER.
x Нулевой байт.
X Дублировать байт.
@ Заполнение нулями до указанной позиции.

Шаблоны подчиняются следующим правилам:

  • За буквой может следовать число, задающее счетчик повторений. Для всех типов, кроме a, A, Z, b, B, h, H, P, извлекается соответствующее количество элементов списка. Если счетчик задан символом *, это означает упаковку всех оставшихся элементов списка (за исключением @, x, X, где этот символ эквивалентен 0, и u, где он эквивалентен 1). Z* означает добавление дополнительного нулевого байта в конец строки. Счетчик повторений для u интерпретируется как максимальное число байтов, которое должно кодироваться в одной строке вывода; при этом 0 и 1 заменяются на 45.
  • Типы a, A, Z всегда извлекают из списка одно значение. Счетчик повторений для них означает длину упакованной строки. Если строка длиннее счетчика, то она усекается; если короче, то дополняется нулями (a, Z) или пробелами (A). При упаковке a и Z эквивалентны; при распаковке A удаляет из строки концевые пробелы и нулевые байты, Z удаляет все после первого нулевого байта, a ничего не удаляет.
  • Типы b и B преобразуют каждый из входных байтов в один бит результата. Результирующий бит равен 0 или 1 в зависимости от значения младшего бита исходного байта. Счетчик повторений задает количество упаковываемых байтов. При этом b упаковывает получаемые биты в байт результата, начиная с младшего его бита, а B — со старшего. Если длина исходной строки не делится на 8, то результат дополняется нулевыми битами. При распаковке эти лишние биты игнорируются. Если входная строка длиннее счетчика, то она усекается. * в качестве счетчика повторений означает использование всех байтов входного поля. При распаковке биты преобразуются в байты "0" и "1".
  • Для типов h и H счетчик повторений означает количество упаковываемых шестнадцатеричных цифр (тетрад). Каждый из входных байтов преобразуется в одну тетраду результата. При этом байты "0"… "9", "a"…"f", "A"…"F" заменяются на соответствующие шестнадцатеричные цифры, а остальные байты на свою младшую тетраду. Тип h упаковывает получаемые тетрады в байт результата, начиная с младшего его тетрады, а H — со старшей. Если длина исходной строки нечетна, то результат дополняется нулевой тетрадой. При распаковке лишняя тетрада игнорируются. Если входная строка длиннее счетчика, то она усекается. * в качестве счетчика повторений означает использование всех байтов входного поля. При распаковке тетрады преобразуются в строку шестнадцатеричных цифр.
  • Тип p упаковывает указатель на строку, оканчивающуюся нулевым байтом, а P — указатель на структуру фиксированной длины, заданной счетчиком повторений. Если значение соответствующего указателя равно undef, то упаковывается нуль.
  • Символ / вместо счетчика повторений позволяет упаковать перед строкой ее длину. Например, шаблон "n/a*" означает, что результат будет состоять из двухбайтового числа, содержащего длину исходной строки, и самой строки.
  • При упаковке не производится никакого выравнивания получаемых значений.
  • Шаблон может содержать комментарий, который начинается с символа # и продолжается до конца строки.
  • Если шаблон требует больше аргументов, чем содержится в списке, то список дополняется пустыми строками "". Если шаблон требует меньше аргументов, чем содержится в списке, то лишние аргументы игнорируются.

Примеры:

$foo = pack("CCCC",65,66,67,68);       # $foo = "ABCD"
$foo = pack("C4",65,66,67,68);         # $foo = "ABCD"
$foo = pack("aaaa","abc","x","y","z"); # $foo = "axyz"
$foo = pack("a14","abcdefg");          # "abcdefg\0\0\0\0\0\0\0"
$foo = pack("s2",1,2);                 # $foo = "\1\0\2\0" в IBM PC, "\0\1\0\2" в Mac

Функция unpack

Синтаксис: unpack шаблон, строка
Аргументы: шаблон, строка — строковые выражения
Результат: массив значений

Функция pack распаковывает строку, упакованную функцией pack(). Она возвращает массив полученных в результате значений (в скалярном контексте возвращает первое полученное значение). Правила распаковки задаются строкой шаблон, строение которой то же, что и для pack(). Дополнительно шаблон может содержать перед буквой, задающей тип распаковки, префикс %n, который указывает, что мы хотим получить не результат распаковки, а его n-битовую контрольную сумму. Остальные подробности см. в описании функции pack(). Следующий пример демонстрирует эффективный способ подсчета количества единичных битов в переменной $mask:

$setbits = unpack("%32b*", $mask);

Функция vec

Синтаксис: vec выражение, смещение, ширина
Аргументы: выражение — строковое выражение
           смещение, ширина — числовые выражения
Результат: числовое значение

Функция vec рассматривает строку выражение как массив, состоящий из элементов заданной ширины в битах. Она извлекает элемент с заданным смещением и возвращает его. Ширина должна степенью числа 2 в диапазоне от 1 до 32 (или 64 на 64-битовых платформах), смещение трактуется как целое число без знака. Пример:

$x = "\x10\x32\x54";  # $x = (0, 1, 2, 3, 4, 5) как вектор 4-битовых чисел
print vec($x, 2, 4);  # поэтому будет выведено число 2

Функция vec может использоваться в левой части оператора присваивания для формирования массива битовых групп в строке. Например, мы могли бы сформировать приведенную выше строку $x так:

vec($x, $_, 4) = $_ foreach (0, 1, 2, 3, 4, 5);

6.9.4. Функции работы с регулярными выражениями

Функция Описание
pos Позиция последнего сопоставления.
quotemeta Преобразует символы в escape-последовательности.
split Расщепляет строку на массив подстрок.
study Компилирует строковое выражение.

Функция pos

Синтаксис: pos аргумент
Аргументы: аргумент — строковая переменная
Результат: числовое значение

Функция pos возвращает позицию в строке аргумент после последнего сопоставления с модификатором g. Если аргумент опущен, то он принимается равным значению переменной $_. Эта функция может употребляться в левой части операции присваивания для задания новой позиции. Такое присваивание изменяет поведение метасимвола \G в последующих сопоставлениях. См. подробнее п. 6.4.6.1.

Функция quotemeta

Синтаксис: quotemeta аргумент
Аргументы: аргумент — строковое выражение
Результат: строковое значение

Функция quotemeta добавляет в строку аргумента символ '\' перед каждым символом, не являющимся латинской буквой или цифрой, и возвращает новую строку в качестве результата. Если аргумент опущен, то он принимается равным значению переменной $_. Это внутренняя функция, которая реализует метасимвол \Q. Пример:

print quotemeta "abc123абв";  # "abc123\а\б\в"

Функция split

Синтаксис: split образец, строка, предел
Аргументы: образец — регулярное выражение
           строка — строковое выражение
           предел — числовое выражение
Результат: список строк

Функция split расщепляет исходную строку на подстроки и возвращает список этих подстрок. В скалярном контексте она заносит список подстрок в массив @_ и возвращает его длину. Если строка опущена, то она принимается равной значению переменной $_. Разбиение на подстроки происходит в позициях сопоставления с заданным образцом; если он опущен, то разбиение производится по символу пробела, при этом начальные пробелы в каждой подстроке удаляются. Если образец содержит круглые скобки, то подстроки, сопоставляемые с выражением в скобках, включаются в результирующий список как отдельные элементы.

Если предел задан и положителен, то он задает максимально допустимое количество извлекаемых подстрок. Если он опущен или равен нулю, то конечные пустые подстроки не включаются в результирующий список. Если же он отрицательный, то возвращаются все извлеченные подстроки. Примеры:

@_ = split(/,/, 'a,b,c,d,');     # @_ = ('a', 'b', 'c', 'd')
@_ = split(/,/, 'a,b,c,d,', 3);  # @_ = ('a', 'b', 'c,d,')
@_ = split(/,/, 'a,b,c,d,', -3); # @_ = ('a', 'b', 'c', 'd', '')
@_ = split(/(,)/, 'a,b,c,d,');   # @_ = ('a', ',', 'b', ',', 'c', ',', 'd', ',')

Функция study

Синтаксис: study строка
Аргументы: строка — строковое выражение
Результат: нет

Функция study компилирует строку (или значение переменной $_, если она опущена) во внутреннее представление. Если строку предполагается многократно сопоставлять с образцом, то ее компиляция может сэкономить время при последующих операциях сопоставления. В каждый момент времени только одна строка может быть скомпилирована; применение функции study к другой строке отменяет компиляцию текущей строки. Пример:

while (<>) {
  study;
  print "Мое\n" if /\bменя\b/;
  print "Твое\n" if /\bтебя\b/;
  ...
}