Spec-Zone.ru › Perl 5.36

perlapi

СОДЕРЖАНИЕ

  • НАЗВАНИЕ
  • ОПИСАНИЕ
  • Обработка AV
  • Функции обратного вызова
  • Приведение типов
  • Изменение регистра символов
  • Классификация символов
  • Информация о компиляторе и препроцессоре
  • Директивы компилятора
  • Временные крючки области действия
  • Конкурентность
  • COP и хэши подсказок
  • Пользовательские операторы
  • Обработка CV
  • Отладка
  • Функции отображения
  • Встраивание, потоки и клонирование интерпретатора
  • Errno
  • Макросы обработки исключений (простые)
  • Значения конфигурации файловой системы
  • Числа с плавающей точкой
  • Общая настройка
    • Список символов возможностей HAS_foo
    • Список символов #include
  • Глобальные переменные
  • Обработка GV и стеков
  • Управление крючками
  • Обработка HV
  • Ввод/вывод
  • Целые числа
  • Форматы ввода/вывода
  • Интерфейс лексического анализатора
  • Локали
  • Магия
  • Управление памятью
  • MRO
  • Функции Multicall
  • Числовые функции
  • Optrees
  • Упаковка и распаковка
  • Структуры данных с выравниванием
  • Доступ к паролям и группам
  • Пути к системным командам
  • Информация о прототипах
  • Функции REGEXP
  • Отчёты и форматы
  • Сигналы
  • Конфигурация сайта
  • Значения конфигурации сокетов
  • Фильтры исходного кода
  • Макросы управления стеком
  • Обработка строк
  • Флаги SV
  • Обработка SV
  • Загрязнение
  • Время
  • Имена typedef
  • Поддержка Unicode
  • Вспомогательные функции
  • Версионирование
  • Предупреждения и выход
  • XS
  • Недокументированные элементы
  • АВТОРЫ
  • СМОТРИТЕ ТАКЖЕ

НАЗВАНИЕ

perlapi - автоматически сгенерированная документация для публичного API Perl

ОПИСАНИЕ

Этот файл содержит большую часть документации публичного API Perl, сгенерированной с помощью embed.pl. В частности, это список функций, макросов, флагов и переменных, которые могут быть использованы разработчиками расширений. Помимо perlintern и config.h, некоторые элементы здесь указаны как фактически документированные в другом POD.

В конце находится список функций, которые ещё не документированы. Исправления приветствуются! Интерфейсы этих функций могут быть изменены без предварительного уведомления.

Некоторые функции, документированные здесь, объединены, так что одна запись служит для нескольких функций, которые выполняют в основном одну и ту же задачу, но имеют небольшие различия. Например, одна форма может обрабатывать магию, а другая — нет. Название каждой разновидности указано в верхней части записи. Но если у всех одинаковая сигнатура (аргументы и возвращаемый тип), за исключением их имён, показывается только использование базовой формы. Если у любой из форм есть другая сигнатура (например, возвращает const или нет), сигнатура каждой функции отображается явно.

Любой элемент, не указанный здесь или в других упомянутых POD, не является частью публичного API и вообще не должен использоваться разработчиками расширений. По этим причинам слепое использование функций, перечисленных в proto.h, следует избегать при написании расширений.

В Perl, в отличие от C, строка символов обычно может содержать встроенные NUL символы. Иногда в документации Perl строка называется «буфером», чтобы отличить её от строки C, но иногда они оба называются просто строками.

Обратите внимание, что все глобальные переменные API Perl должны быть отнесены к префиксу PL_. Опять же, те, что не перечислены здесь, не должны использоваться разработчиками расширений и могут быть изменены или удалены без предварительного уведомления; то же относится и к макросам. Некоторые макросы предоставляются для совместимости со старыми, не приукрашенными именами, но эта поддержка может быть отключена в будущей версии.

Perl изначально был написан для обработки только US-ASCII (т. е. символов, порядковые номера которых находятся в диапазоне от 0 до 127). И документация, и комментарии всё ещё могут использовать термин ASCII, когда на самом деле подразумевается весь диапазон от 0 до 255.

Символы не-ASCII ниже 256 могут иметь различные значения в зависимости от различных факторов. (См. в первую очередь perllocale.) Но обычно весь диапазон можно назвать ISO-8859-1. Часто термин «Latin-1» (или «Latin1») используется как эквивалент ISO-8859-1. Но некоторые люди рассматривают «Latin1» как относящийся только к символам в диапазоне от 128 до 255, или иногда от 160 до 255. В этой документации «Latin1» и «Latin-1» используются для обозначения всех 256 символов.

Обратите внимание, что Perl можно скомпилировать и запустить как под ASCII, так и под EBCDIC (см. perlebcdic). Большая часть документации (и даже комментарии в коде) игнорирует возможность EBCDIC. Для почти всех целей различия прозрачны. Например, под EBCDIC вместо UTF-8 используется UTF-EBCDIC для кодирования строк Unicode, и поэтому, когда в этой документации упоминается utf8 (и варианты этого имени, в том числе в именах функций), это также (практически прозрачно) означает UTF-EBCDIC. Но порядковые номера символов различаются между ASCII, EBCDIC и кодировками UTF, и строка, закодированная в UTF-EBCDIC, может занимать другое количество байтов, чем в UTF-8.

Структура этого документа является предварительной и может быть изменена. Предложения и исправления приветствуются perl5-porters@perl.org.

В настоящее время в этом документе есть следующие разделы

"Обработка AV"
"Функции обратного вызова"
"Преобразование типов"
"Изменение регистра символов"
"Классификация символов"
"Информация о компиляторе и препроцессоре"
"Директивы компилятора"
"Обработчики области видимости во время компиляции"
"Конкурентность"
"COP и хеши подсказок"
"Пользовательские операторы"
"Обработка CV"
"Отладка"
"Функции отображения"
"Встраивание, потоки и клонирование интерпретатора"
"Errno"
"Макросы обработки исключений (простые)"
"Значения конфигурации файловой системы"
"Числа с плавающей точкой"
"Общая конфигурация"
"Глобальные переменные"
"Обработка GV и стеки"
"Управление хуками"
"Обработка HV"
"Ввод/вывод"
"Целые числа"
"Форматы ввода/вывода"
"Интерфейс лексического анализатора"
"Локали"
"Магия"
"Управление памятью"
"MRO"
"Функции многократного вызова"
"Функции чисел"
"Optrees"
"Упаковка и распаковка"
"Структуры данных с заполнителями"
"Доступ к паролям и группам"
"Пути к системным командам"
"Информация о прототипах"
"Функции REGEXP"
"Отчёты и форматы"
"Сигналы"
"Настройка сайта"
"Значения конфигурации сокетов"
"Фильтры исходного кода"
"Макросы управления стеком"
"Обработка строк"
"Флаги SV"
"Обработка SV"
"Заражение"
"Время"
"Имена typedef"
"Поддержка Unicode"
"Вспомогательные функции"
"Версионирование"
"Предупреждения и завершение"
"XS"
"Недокументированные элементы"

Список ниже отсортирован по алфавиту, регистр не учитывается.

Обработка AV

AV

Описание в perlguts.

AvALLOC

Описание в perlguts.

AvALLOC(AV* av)
AvARRAY

Возвращает указатель на внутренний массив SV* AV.

Это полезно для арифметики указателей по массиву. Если вам нужно только получить элемент массива, то предпочтительнее av_fetch.

SV**  AvARRAY(AV* av)
av_clear

Освобождает все элементы массива, оставляя его пустым. Аналог @array = () в XS. См. также "av_undef".

Обратите внимание, что действия деструктора, вызываемого напрямую или косвенно при освобождении элемента массива, могут привести к уменьшению счётчика ссылок самого массива (например, удаление записи в таблице символов). Поэтому существует вероятность, что AV будет освобождён (или даже перераспределён) при возврате из вызова, если вы не держите ссылку на него.

void  av_clear(AV *av)
av_count

Возвращает количество элементов в массиве av. Это истинное количество элементов, включая неопределённые. Оно всегда равно av_top_index(av) + 1.

Size_t  av_count(AV *av)
av_create_and_push

Добавляет SV в конец массива, создавая массив при необходимости. Небольшая внутренняя вспомогательная функция для удаления повторяющегося кода.

ПРИМЕЧАНИЕ: av_create_and_push необходимо вызывать явно как Perl_av_create_and_push с параметром aTHX_.

void  Perl_av_create_and_push(pTHX_ AV **const avp,
                              SV *const val)
av_create_and_unshift_one

Добавляет SV в начало массива, создавая массив при необходимости. Небольшая внутренняя вспомогательная функция для удаления повторяющегося кода.

ПРИМЕЧАНИЕ: av_create_and_unshift_one необходимо вызывать явно как Perl_av_create_and_unshift_one с параметром aTHX_.

SV**  Perl_av_create_and_unshift_one(pTHX_ AV **const avp,
                                     SV *const val)
av_delete

Удаляет элемент с индексом key из массива, делает элемент смертным и возвращает его. Если flags равно G_DISCARD, элемент освобождается и возвращается NULL. Также возвращается NULL, если key вне диапазона.

Аналог в Perl: splice(@myarray, $key, 1, undef) (с splice в контексте void, если G_DISCARD присутствует).

SV*  av_delete(AV *av, SSize_t key, I32 flags)
av_exists

Возвращает true, если элемент с индексом key был инициализирован.

Это основано на том, что неинициализированные элементы массива установлены в NULL.

Аналог в Perl: exists($myarray[$key]).

bool  av_exists(AV *av, SSize_t key)
av_extend

Предварительно увеличивает размер массива, чтобы он мог хранить значения с индексами 0..key. Таким образом, av_extend(av,99) гарантирует, что массив может хранить 100 элементов, т. е. что av_store(av, 0, sv) до av_store(av, 99, sv) в обычном массиве будут работать без дополнительного выделения памяти.

Если аргумент av является связанным массивом, то вызывается метод связанного массива EXTEND с аргументом (key+1).

void  av_extend(AV *av, SSize_t key)
av_fetch

Возвращает SV по указанному индексу в массиве. key — индекс. Если lval равно true, вы гарантированно получите реальный SV (в случае, если он не был реальным ранее), который затем можно изменить. Проверьте, что возвращаемое значение не NULL, прежде чем обращаться к нему как к SV*.

См. "Понимание магии связанных хешей и массивов" в perlguts для получения дополнительной информации о использовании этой функции с связанными массивами.

Примерный аналог в Perl: $myarray[$key].

SV**  av_fetch(AV *av, SSize_t key, I32 lval)
AvFILL

То же, что и "av_top_index" или "av_tindex".

SSize_t  AvFILL(AV* av)
av_fill

Устанавливает максимальный индекс в массиве на заданное число, эквивалентно Perl's $#array = $fill;.

Количество элементов в массиве будет fill + 1 после возвращения av_fill(). Если массив был короче, то добавленные элементы устанавливаются в NULL. Если массив был длиннее, то лишние элементы освобождаются. av_fill(av, -1) то же самое, что и av_clear(av).

void  av_fill(AV *av, SSize_t fill)
av_len

То же, что и "av_top_index". Обратите внимание, что, вопреки названию, возвращает максимальный индекс в массиве. В отличие от "sv_len", который возвращает ожидаемое значение.

Для получения истинного количества элементов в массиве используйте "av_count".

SSize_t  av_len(AV *av)
av_make

Создаёт новый AV и заполняет его списком (**strp, длина size) SV. Создаётся копия каждого SV, поэтому их счётчики ссылок не изменяются. У нового AV будет счётчик ссылок 1.

Аналог в Perl: my @new_array = ($scalar1, $scalar2, $scalar3...);

AV*  av_make(SSize_t size, SV **strp)
av_pop

Удаляет один SV из конца массива, уменьшая его размер на единицу и возвращая SV (передавая управление одним счётчиком ссылок) вызывающей стороне. Возвращает &PL_sv_undef если массив пустой.

Аналог в Perl: pop(@myarray);

SV*  av_pop(AV *av)
av_push

Добавляет SV (передавая управление одним счётчиком ссылок) в конец массива. Массив автоматически увеличивается, чтобы вместить добавление.

Аналог в Perl: push @myarray, $val;.

void  av_push(AV *av, SV *val)
av_shift

Удаляет один SV из начала массива, уменьшая его размер на единицу и возвращая SV (передавая управление одним счётчиком ссылок) вызывающей стороне. Возвращает &PL_sv_undef если массив пустой.

Аналог в Perl: shift(@myarray);

SV*  av_shift(AV *av)
av_store

Хранит SV в массиве. Индекс массива указан как key. Возвращаемое значение будет NULL, если операция завершилась неудачно или если значение не нужно было фактически хранить в массиве (например, в случае связанных массивов). В противном случае, на него можно сослаться, чтобы получить сохранённое там SV* (= val).

Обратите внимание, что вызывающая сторона должна должным образом увеличить счётчик ссылок val перед вызовом и уменьшить его, если функция вернула NULL.

Приблизительный эквивалент на Perl: splice(@myarray, $key, 1, $val).

См. "Понимание магии связанных хэшей и массивов" в perlguts для получения дополнительной информации о том, как использовать эту функцию для связанных массивов.

SV**  av_store(AV *av, SSize_t key, SV *val)
av_tindex
av_top_index

Эти функции ведут себя идентично. Если массив av пуст, они возвращают -1; в противном случае, они возвращают максимальное значение индексов всех элементов массива, которые в настоящее время определены в av.

Они обрабатывают «get» магию.

Эквивалент на Perl для этих функций — $#av.

Используйте "av_count" для получения количества элементов в массиве.

SSize_t  av_tindex(AV *av)
av_undef

Уничтожает массив. Эквивалент XS функции undef(@array).

Помимо освобождения всех элементов массива (как av_clear()), эта функция также освобождает память, используемую av для хранения списка скаляров.

См. "av_clear" для заметки о том, что массив потенциально может быть недействительным при возврате.

void  av_undef(AV *av)
av_unshift

Вставляет указанное количество undef значений в начало массива. Массив будет автоматически расширяться для размещения добавлений.

Эквивалент на Perl: unshift @myarray, ((undef) x $num);

void  av_unshift(AV *av, SSize_t num)
get_av

Возвращает AV указанного Perl-глобального или пакетного массива с заданным именем (поэтому он не будет работать с лексическими переменными). flags передаются в gv_fetchpv. Если GV_ADD установлено, и Perl-переменная не существует, она будет создана. Если flags равно нулю, и переменная не существует, возвращается NULL.

Эквивалент на Perl: @{"$name"}.

ПРИМЕЧАНИЕ: форма perl_get_av() устарела.

AV*  get_av(const char *name, I32 flags)
newAV
newAV_alloc_x
newAV_alloc_xz

Все эти функции создают новый AV, устанавливая счётчик ссылок в 1. Если вы также знаете начальные элементы массива, см. "av_make".

В качестве справки, массив состоит из трёх частей:

  1. Структура данных, содержащая информацию о массиве в целом, такую как его размер и счётчик ссылок.

  2. Массив языка C, содержащий указатели на отдельные элементы. Они обрабатываются как указатели на SV, поэтому все должны быть приводимы к типу SV*.

  3. Сами отдельные элементы. Это могут быть, например, SV и/или AV и/или HV и т. д.

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

newAV форма

Это не делает ничего, кроме создания структуры данных всего массива. Эквивалент на Perl приблизительно my @array;

Это полезно, когда минимальный размер массива может быть равен нулю (возможно, есть вероятные пути кода, которые полностью пропустят его использование).

Если массив используется, структура данных указателей должна быть выделена в этот момент. Это будет сделано функцией "av_extend">, либо явно:

av_extend(av, len);

или неявно при хранении первого элемента:

(void)av_store(av, 0, sv);

Неиспользуемые элементы массива обычно инициализируются av_extend.

newAV_alloc_x форма

Это фактически выполняет newAV и также выделяет (неинициализированное) место для массива указателей. Это используется, когда заранее известно предполагаемое минимальное значение размера массива. Это более эффективно, чем выполнение обычного newAV и последующего av_extend.

Конечно, массив можно расширить позже, если это потребуется.

size должен быть не менее 1.

newAV_alloc_xz форма

Это newAV_alloc_x, но инициализирует каждый указатель в нём значением NULL. Это добавляет безопасность, чтобы предотвратить их чтение до задания.

size должен быть не менее 1.

Следующие примеры создают массив, способный вместить четыре элемента (индексы 0 .. 3):

AV *av = newAV();
av_extend(av, 3);

AV *av = newAV_alloc_x(4);

AV *av = newAV_alloc_xz(4);

В отличие от этого, следующие примеры выделяют массив, который гарантированно вмещает только один элемент без расширения:

AV *av = newAV_alloc_x(1);
AV *av = newAV_alloc_xz(1);
AV*  newAV         ()
AV*  newAV_alloc_x (SSize_t size)
AV*  newAV_alloc_xz(SSize_t size)
Nullav

DEPRECATED! Планируется удалить Nullav из будущих версий Perl. Не используйте её для нового кода; удалите её из существующего кода.

Указатель на нулевой AV.

(устарело — используйте (AV *)NULL вместо этого)

Функции обратного вызова

call_argv

Выполняет обратный вызов указанной подпрограмме Perl с именованными и пакетными параметрами argv (массивом строк, завершённым NULL). См. perlcall.

Приблизительный эквивалент на Perl: &{"$sub_name"}(@$argv).

ПРИМЕЧАНИЕ: форма perl_call_argv() устарела.

I32  call_argv(const char* sub_name, I32 flags, char** argv)
call_method

Выполняет обратный вызов указанного Perl-метода. Благословенный объект должен находиться в стеке. См. perlcall.

ПРИМЕЧАНИЕ: форма perl_call_method() устарела.

I32  call_method(const char* methname, I32 flags)
call_pv

Выполняет обратный вызов указанной Perl-подпрограммы. См. perlcall.

ПРИМЕЧАНИЕ: форма perl_call_pv() устарела.

I32  call_pv(const char* sub_name, I32 flags)
call_sv

Выполняет обратный вызов Perl-подпрограммы, указанной в SV.

Если ни флаг G_METHOD, ни флаг G_METHOD_NAMED не заданы, SV может быть любым из CV, GV, ссылкой на CV, ссылкой на GV или SvPV(sv), которые будут использованы в качестве имени вызываемой подпрограммы.

Если задан флаг G_METHOD, SV может быть ссылкой на CV или SvPV(sv), которые будут использованы в качестве имени вызываемого метода.

Если задан флаг G_METHOD_NAMED, SvPV(sv) будет использовано в качестве имени вызываемого метода.

Некоторые другие значения обрабатываются специально для внутреннего использования и не должны использоваться.

См. perlcall.

ПРИМЕЧАНИЕ: форма perl_call_sv() устарела.

I32  call_sv(SV* sv, volatile I32 flags)
DESTRUCTORFUNC_NOCONTEXT_t

Описано в perlguts.

DESTRUCTORFUNC_t

Описано в perlguts.

ENTER

Открывающая скобка для обратного вызова. См. "LEAVE" и perlcall.

ENTER;
ENTER_with_name

Аналогично "ENTER", но при включённом отладке также связывает заданную строку литерала с новым областью видимости.

ENTER_with_name("name");
eval_pv

Заставляет Perl eval заданную строку в скалярном контексте и возвращает результат SV*.

ПРИМЕЧАНИЕ: форма perl_eval_pv() устарела.

SV*  eval_pv(const char* p, I32 croak_on_error)
eval_sv

Заставляет Perl eval строку в SV. Поддерживает те же флаги, что и call_sv, за исключением очевидного исключения G_EVAL. См. perlcall.

Флаг G_RETHROW можно использовать, если вам нужно только выполнить eval_sv() для кода, определенного строкой, но не обрабатывать ошибки.

ПРИМЕЧАНИЕ: форма perl_eval_sv() устарела.

I32  eval_sv(SV* sv, I32 flags)
FREETMPS

Закрывающая скобка для временных переменных в обратном вызове. См. "SAVETMPS" и perlcall.

FREETMPS;
G_DISCARD

Описано в perlcall.

G_EVAL

Описано в perlcall.

GIMME

DEPRECATED! Планируется удалить GIMME из будущих версий Perl. Не используйте её для нового кода; удалите её из существующего кода.

Обратно совместимая версия GIMME_V, которая может возвращать только G_SCALAR или G_LIST; в контексте void она возвращает G_SCALAR. Устарело. Используйте GIMME_V вместо этого.

U32  GIMME
GIMME_V

Эквивалент Perl's wantarray для XSUB-писателя. Возвращает G_VOID, G_SCALAR или G_LIST для контекстов void, скаляр или список соответственно. См. perlcall для примера использования.

U32  GIMME_V
G_KEEPERR

Описано в perlcall.

G_LIST

Описано в perlcall.

G_NOARGS

Описано в perlcall.

G_SCALAR

Описано в perlcall.

G_VOID

Описано в perlcall.

is_lvalue_sub

Возвращает ненулевое значение, если подпрограмма, вызывающая эту функцию, вызывается в контексте lvalue. В противном случае возвращает 0.

I32  is_lvalue_sub()
LEAVE

Закрывающая скобка для обратного вызова. См. "ENTER" и perlcall.

LEAVE;
LEAVE_with_name

Аналогично "LEAVE", но при включённой отладке сначала проверяет, содержит ли область видимости заданное имя. name должно быть строкой-литералом.

LEAVE_with_name("name");
PL_errgv

Описано в perlcall.

save_aptr

Описано в perlguts.

void  save_aptr(AV** aptr)
save_ary

Описание в perlguts.

AV*  save_ary(GV* gv)
SAVEBOOL

Описание в perlguts.

SAVEBOOL(bool i)
SAVEDELETE

Описание в perlguts.

SAVEDELETE(HV * hv, char * key, I32 length)
SAVEDESTRUCTOR

Описание в perlguts.

SAVEDESTRUCTOR(DESTRUCTORFUNC_NOCONTEXT_t f, void *p)
SAVEDESTRUCTOR_X

Описание в perlguts.

SAVEDESTRUCTOR_X(DESTRUCTORFUNC_t f, void *p)
SAVEFREEOP

Описание в perlguts.

SAVEFREEOP(OP *op)
SAVEFREEPV

Описание в perlguts.

SAVEFREEPV(void * p)
SAVEFREESV

Описание в perlguts.

SAVEFREESV(SV* sv)
save_hash

Описание в perlguts.

HV*  save_hash(GV* gv)
save_hptr

Описание в perlguts.

void  save_hptr(HV** hptr)
SAVEI8

Описание в perlguts.

SAVEI8(I8 i)
SAVEI32

Описание в perlguts.

SAVEI32(I32 i)
SAVEI16

Описание в perlguts.

SAVEI16(I16 i)
SAVEINT

Описание в perlguts.

SAVEINT(int i)
save_item

Описание в perlguts.

void  save_item(SV* item)
SAVEIV

Описание в perlguts.

SAVEIV(IV i)
save_list

DEPRECATED! Планируется удалить save_list в будущей версии Perl. Не используйте в новом коде; удалите из существующего кода.

Описание в perlguts.

void  save_list(SV** sarg, I32 maxsarg)
SAVELONG

Описание в perlguts.

SAVELONG(long i)
SAVEMORTALIZESV

Описание в perlguts.

SAVEMORTALIZESV(SV* sv)
SAVEPPTR

Описание в perlguts.

SAVEPPTR(char * p)
save_scalar

Описание в perlguts.

SV*  save_scalar(GV* gv)
SAVESPTR

Описание в perlguts.

SAVESPTR(SV * s)
SAVESTACK_POS

Описание в perlguts.

SAVESTACK_POS()
SAVESTRLEN

Описание в perlguts.

SAVESTRLEN(STRLEN i)
save_svref

Описание в perlguts.

SV*  save_svref(SV** sptr)
SAVETMPS

Открывающая скобка для временных значений при вызове обратного вызова. См. "FREETMPS" и perlcall.

SAVETMPS;

Преобразование типов

cBOOL

Преобразование в булево значение. Когда Perl можно было компилировать на компиляторах до C99, преобразование (bool) не всегда выполнялось корректно, поэтому была создана эта макрокоманда (и сделана несколько сложной, чтобы обойти ошибки в старых компиляторах). Сейчас, спустя много лет, используется C99, и это больше не требуется, но сохраняется для обратной совместимости.

bool  cBOOL(bool expr)
I_32

Преобразование NV в I32, избегая неопределённого поведения C

I32  I_32(NV what)
INT2PTR

Описание в perlguts.

type  INT2PTR(type, int value)
I_V

Преобразование NV в IV, избегая неопределённого поведения C

IV  I_V(NV what)
PTR2IV

Описание в perlguts.

IV  PTR2IV(void * ptr)
PTR2nat

Описание в perlguts.

IV  PTR2nat(void *)
PTR2NV

Описание в perlguts.

NV  PTR2NV(void * ptr)
PTR2ul

Описание в perlguts.

unsigned long  PTR2ul(void *)
PTR2UV

Описание в perlguts.

UV  PTR2UV(void * ptr)
PTRV

Описание в perlguts.

U_32

Преобразование NV в U32, избегая неопределённого поведения C

U32  U_32(NV what)
U_V

Преобразование NV в UV, избегая неопределённого поведения C

UV  U_V(NV what)

Изменение регистра символов

Perl использует полные отображения Unicode-регистра. Это означает, что преобразование одного символа в другой регистр может привести к последовательности более одного символа. Например, заглавная буква от ß (маленькая буква с острым S) — это последовательность из двух символов SS. Это создаёт некоторые сложности. Строчные буквы всех символов в диапазоне 0..255 — это один символ, и поэтому предоставляется "toLOWER_L1". Но toUPPER_L1 не может существовать, так как не может вернуть правильный результат для всех допустимых входных данных. Вместо этого "toUPPER_uvchr" имеет API, который позволяет вернуть все возможные корректные результаты.) Точно так же не реализованы другие функции, которые не могут обеспечить правильные результаты для всего диапазона возможных входных данных.

toFOLD
toFOLD_A
toFOLD_uvchr
toFOLD_utf8
toFOLD_utf8_safe

Все эти функции возвращают сложенный регистр символа. «Сложенный регистр» — это внутренний регистр для /i сопоставления шаблонов. Если сложенный регистр символа A и сложенный регистр символа B совпадают, они совпадают без учёта регистра; в противном случае они не совпадают.

Различия в формах заключаются в области их действия и в том, задаётся ли входной код как точечный символ (эти формы с параметром cp) или как строка UTF-8 (другие). В последнем случае используемый точечный символ — это первый символ в буфере кодовых точек UTF-8, ограниченных аргументами p .. e - 1.

toFOLD и toFOLD_A являются синонимами друг друга. Они возвращают сложенный регистр любого символа ASCII. В этом диапазоне сложенный регистр идентичен строчному регистру. Все другие входные данные возвращаются без изменений. Поскольку это макросы, тип входных данных может быть любым целочисленным, и выходные данные будут занимать столько же бит, сколько входные.

Нет toFOLD_L1 и toFOLD_LATIN1, так как сложенный регистр некоторых кодовых точек в диапазоне 0..255 находится за пределами этого диапазона или состоит из нескольких символов. Вместо этого используйте toFOLD_uvchr.

toFOLD_uvchr возвращает сложенный регистр любой Unicode-кодовой точки. Результат идентичен результату toFOLD_A для входных кодовых точек ASCII. Сложенный регистр большинства Unicode-кодовых точек совпадает с самим кодовым символом. В этих случаях и для кодовых точек, превышающих максимальное значение Unicode, функция возвращает входную кодовую точку без изменений. Дополнительно она записывает UTF-8 результата в буфер, начинающийся с s, и его длину в байтах в *lenp. Вызывающая функция должна сделать s достаточно большим, чтобы содержать по крайней мере UTF8_MAXBYTES_CASE+1 байта, чтобы избежать возможного переполнения.

ПРИМЕЧАНИЕ: сложенный регистр кодовой точки может содержать более одной кодовой точки. Возвращаемое значение этой функции — только первая из них. Весь сложенный регистр возвращается в s. Чтобы определить, что результат содержит более одной кодовой точки, можно сделать следующее:

uc = toFOLD_uvchr(cp, s, &len);
if (len > UTF8SKIP(s)) { is multiple code points }
else { is a single code point }

toFOLD_utf8 и toFOLD_utf8_safe являются синонимами друг друга. Единственное различие между ними и toFOLD_uvchr заключается в том, что источник для этих функций закодирован в UTF-8, а не представляет собой кодовую точку. Он передаётся как буфер, начинающийся с p, а e указывает на байт за его концом. Буфер p может, безусловно, содержать более одной кодовой точки, но только первая из них (до e - 1) рассматривается. Если UTF-8 входного символа содержит какие-либо ошибки, программа может выдавать ошибку или функция может возвращать ЗАМЕЩАЮЩИЙ СИМВОЛ по усмотрению реализации и с возможностью изменения в будущих версиях.

UV  toFOLD          (UV cp)
UV  toFOLD_A        (UV cp)
UV  toFOLD_uvchr    (UV cp, U8* s, STRLEN* lenp)
UV  toFOLD_utf8     (U8* p, U8* e, U8* s, STRLEN* lenp)
UV  toFOLD_utf8_safe(U8* p, U8* e, U8* s, STRLEN* lenp)
toLOWER
toLOWER_A
toLOWER_L1
toLOWER_LATIN1
toLOWER_LC
toLOWER_uvchr
toLOWER_utf8
toLOWER_utf8_safe

Все эти функции возвращают строчные буквы символа. Различия заключаются в области их применения и в том, задаётся ли входной параметр как код символа (функции с параметром cp) или как строка UTF-8 (другие функции). В последнем случае код символа берётся из первого кодированного в UTF-8 символа в буфере, определяемом аргументами p .. e - 1.

toLOWER и toLOWER_A являются синонимами. Они возвращают строчную версию любого символа ASCII в верхнем регистре. Все остальные входные значения возвращаются без изменений. Поскольку это макросы, тип входного значения может быть любым целочисленным, а выходное значение займёт такое же количество битов, что и входное.

toLOWER_L1 и toLOWER_LATIN1 являются синонимами. Они ведут себя идентично toLOWER, но также возвращают строчную версию любого символа в верхнем регистре в диапазоне 0..255, предполагая кодировку Latin-1 (или эквивалент EBCDIC на соответствующих платформах).

toLOWER_LC возвращает строчную версию входного кода символа согласно правилам текущего POSIX-локали. Входные символы за пределами диапазона 0..255 возвращаются без изменений.

toLOWER_uvchr возвращает строчную версию любого Unicode-символа. Результат совпадает с toLOWER_L1 для входных кодов символов в диапазоне 0..255. Строчная форма большинства Unicode-символов совпадает с самим символом. Для таких символов, а также для символов с кодом выше максимального значения Unicode, функция возвращает входной код символа без изменений. Кроме того, она сохраняет UTF-8 результат в буфер, начиная с s, и его длину в байтах в *lenp. Вызывающая функция должна обеспечить, чтобы буфер s был достаточно большим, чтобы вместить не менее UTF8_MAXBYTES_CASE+1 байтов, чтобы избежать возможного переполнения.

ПРИМЕЧАНИЕ: строчная форма символа может состоять из более чем одного символа. Возвращаемое значение этой функции — только первый из них. Полная строчная форма возвращается в s. Чтобы определить, состоит ли результат более чем из одного символа, можно сделать так:

uc = toLOWER_uvchr(cp, s, &len);
if (len > UTF8SKIP(s)) { is multiple code points }
else { is a single code point }

toLOWER_utf8 и toLOWER_utf8_safe являются синонимами. Единственное отличие этих функций от toLOWER_uvchr состоит в том, что исходные данные закодированы в UTF-8, а не представлены как код символа. Они передаются как буфер, начинающийся с p, а e указывает на байт, следующий за концом буфера. Буфер p может содержать более одного символа; но рассматривается только первый (до e - 1). Если UTF-8 кодировка входного символа содержит ошибки, программа может прекратить выполнение или функция может вернуть ЗАМЕЩАЮЩИЙ СИМВОЛ по усмотрению реализации и с возможностью изменения в будущих версиях.

UV  toLOWER          (UV cp)
UV  toLOWER_A        (UV cp)
UV  toLOWER_L1       (UV cp)
UV  toLOWER_LATIN1   (UV cp)
UV  toLOWER_LC       (UV cp)
UV  toLOWER_uvchr    (UV cp, U8* s, STRLEN* lenp)
UV  toLOWER_utf8     (U8* p, U8* e, U8* s, STRLEN* lenp)
UV  toLOWER_utf8_safe(U8* p, U8* e, U8* s, STRLEN* lenp)
toTITLE
toTITLE_A
toTITLE_uvchr
toTITLE_utf8
toTITLE_utf8_safe

Все эти функции возвращают заглавные буквы символа. Различия заключаются в области их применения и в том, задаётся ли входной параметр как код символа (функции с параметром cp) или как строка UTF-8 (другие функции). В последнем случае код символа берётся из первого кодированного в UTF-8 символа в буфере, определяемом аргументами p .. e - 1.

toTITLE и toTITLE_A являются синонимами. Они возвращают заглавные буквы любого символа ASCII в нижнем регистре. В этом диапазоне заглавные буквы совпадают с прописными. Все остальные входные значения возвращаются без изменений. Поскольку это макросы, тип входного значения может быть любым целочисленным, а выходное значение займёт такое же количество битов, что и входное.

Нет toTITLE_L1 и toTITLE_LATIN1, поскольку заглавные буквы некоторых символов в диапазоне 0..255 находятся вне этого диапазона или состоят из нескольких символов. Используйте toTITLE_uvchr.

toTITLE_uvchr возвращает заглавные буквы любого Unicode-символа. Результат совпадает с toTITLE_A для символов ASCII. Заглавные буквы большинства Unicode-символов совпадают с самим символом. Для таких символов, а также для символов с кодом выше максимального значения Unicode, функция возвращает входной код символа без изменений. Кроме того, она сохраняет UTF-8 результат в буфер, начиная с s, и его длину в байтах в *lenp. Вызывающая функция должна обеспечить, чтобы буфер s был достаточно большим, чтобы вместить не менее UTF8_MAXBYTES_CASE+1 байтов, чтобы избежать возможного переполнения.

ПРИМЕЧАНИЕ: заглавные буквы символа могут состоять из более чем одного символа. Возвращаемое значение этой функции — только первый из них. Полная заглавная форма возвращается в s. Чтобы определить, состоит ли результат более чем из одного символа, можно сделать так:

uc = toTITLE_uvchr(cp, s, &len);
if (len > UTF8SKIP(s)) { is multiple code points }
else { is a single code point }

toTITLE_utf8 и toTITLE_utf8_safe являются синонимами. Единственное отличие этих функций от toTITLE_uvchr состоит в том, что исходные данные закодированы в UTF-8, а не представлены как код символа. Они передаются как буфер, начинающийся с p, а e указывает на байт, следующий за концом буфера. Буфер p может содержать более одного символа; но рассматривается только первый (до e - 1). Если UTF-8 кодировка входного символа содержит ошибки, программа может прекратить выполнение или функция может вернуть ЗАМЕЩАЮЩИЙ СИМВОЛ по усмотрению реализации и с возможностью изменения в будущих версиях.

UV  toTITLE          (UV cp)
UV  toTITLE_A        (UV cp)
UV  toTITLE_uvchr    (UV cp, U8* s, STRLEN* lenp)
UV  toTITLE_utf8     (U8* p, U8* e, U8* s, STRLEN* lenp)
UV  toTITLE_utf8_safe(U8* p, U8* e, U8* s, STRLEN* lenp)
toUPPER
toUPPER_A
toUPPER_uvchr
toUPPER_utf8
toUPPER_utf8_safe

Все эти функции возвращают прописные буквы символа. Различия заключаются в области их применения и в том, задаётся ли входной параметр как код символа (функции с параметром cp) или как строка UTF-8 (другие функции). В последнем случае код символа берётся из первого кодированного в UTF-8 символа в буфере, определяемом аргументами p .. e - 1.

toUPPER и toUPPER_A являются синонимами. Они возвращают прописные буквы любого символа ASCII в нижнем регистре. Все остальные входные значения возвращаются без изменений. Поскольку это макросы, тип входного значения может быть любым целочисленным, а выходное значение займёт такое же количество битов, что и входное.

Нет toUPPER_L1 и toUPPER_LATIN1, поскольку прописные буквы некоторых символов в диапазоне 0..255 находятся вне этого диапазона или состоят из нескольких символов. Используйте toUPPER_uvchr.

toUPPER_uvchr возвращает прописные буквы любого Unicode-символа. Результат совпадает с toUPPER_A для символов ASCII. Прописные буквы большинства Unicode-символов совпадают с самим символом. Для таких символов, а также для символов с кодом выше максимального значения Unicode, функция возвращает входной код символа без изменений. Кроме того, она сохраняет UTF-8 результат в буфер, начиная с s, и его длину в байтах в *lenp. Вызывающая функция должна обеспечить, чтобы буфер s был достаточно большим, чтобы вместить не менее UTF8_MAXBYTES_CASE+1 байтов, чтобы избежать возможного переполнения.

ПРИМЕЧАНИЕ: прописные буквы символа могут состоять из более чем одного символа. Возвращаемое значение этой функции — только первый из них. Полная прописная форма возвращается в s. Чтобы определить, состоит ли результат более чем из одного символа, можно сделать так:

uc = toUPPER_uvchr(cp, s, &len);
if (len > UTF8SKIP(s)) { is multiple code points }
else { is a single code point }

toUPPER_utf8 и toUPPER_utf8_safe являются синонимами. Единственное отличие этих функций от toUPPER_uvchr состоит в том, что исходные данные закодированы в UTF-8, а не представлены как код символа. Они передаются как буфер, начинающийся с p, а e указывает на байт, следующий за концом буфера. Буфер p может содержать более одного символа; но рассматривается только первый (до e - 1). Если UTF-8 кодировка входного символа содержит ошибки, программа может прекратить выполнение или функция может вернуть ЗАМЕЩАЮЩИЙ СИМВОЛ по усмотрению реализации и с возможностью изменения в будущих версиях.

UV  toUPPER          (UV cp)
UV  toUPPER_A        (UV cp)
UV  toUPPER_uvchr    (UV cp, U8* s, STRLEN* lenp)
UV  toUPPER_utf8     (U8* p, U8* e, U8* s, STRLEN* lenp)
UV  toUPPER_utf8_safe(U8* p, U8* e, U8* s, STRLEN* lenp)

Классификация символов

В этом разделе описаны функции (на самом деле макросы), которые классифицируют символы по типам, например, знаки препинания против букв и т. д. Большинство из них аналогичны классам символов регулярных выражений. (См. "POSIX Character Classes" в perlrecharclass.) Существует несколько вариантов для каждого класса. (Не все макросы имеют все варианты; каждый пункт ниже перечисляет те, которые применимы к нему.) Ни на один из них не влияет use bytes, а только те, в имени которых есть LC, зависят от текущей локали.

Основная функция, например, isALPHA(), принимает любое целое значение со знаком или без знака, рассматривая его как код символа, и возвращает логическое значение, определяющее, является ли представляемый им символ (или, на платформах с не-ASCII, соответствующий ему символ) символом ASCII в указанном классе в соответствии с правилами платформы, Unicode и Perl. Если входное число не помещается в один байт, возвращается FALSE.

Вариант isFOO_A (например, isALPHA_A()) идентичен основной функции без суффикса "_A". Этот вариант используется для того, чтобы подчеркнуть, что только символы ASCII могут вернуть TRUE.

Вариант isFOO_L1 накладывает на платформу набор символов Latin-1 (или эквивалент EBCDIC). То есть символы ASCII не меняются, поскольку ASCII является подмножеством Latin-1. Но символы, не являющиеся ASCII, обрабатываются так, как будто они — символы Latin-1. Например, isWORDCHAR_L1() вернёт true при вызове с кодом символа 0xDF, который является символом слова как в ASCII, так и в EBCDIC (хотя он представляет разные символы в каждом из них). Если входное число не помещается в один байт, возвращается FALSE. (В документации Perl используется разговорное определение Latin-1, включающее все кодовые точки ниже 256.)

Вариант isFOO_uvchr точно такой же, как вариант isFOO_L1 для входных значений ниже 256, но если код символа больше 255, для определения его принадлежности к классу символов используются правила Unicode. Например, isWORDCHAR_uvchr(0x100) возвращает TRUE, поскольку 0x100 — это ЗАГЛАВНАЯ БУКВА A С ДИАРЕЗИСОМ в Unicode и является символом слова.

Варианты isFOO_utf8 и isFOO_utf8_safe похожи на isFOO_uvchr, но используются для строк с кодировкой UTF-8. Эти два варианта — разные названия одного и того же. Каждый вызов одного из этих вариантов классифицирует первый символ строки, начиная с p. Второй параметр, e, указывает на любое место в строке после первого символа, до одного байта за границами всей строки. Несмотря на то, что оба варианта идентичны, суффикс _safe в одном из названий подчёркивает, что он не будет пытаться читать за пределами e - 1, при условии, что ограничение s < e истинно (это утверждается для -DDEBUGGING сборки). Если UTF-8 для входного символа каким-либо образом некорректен, программа может прекратить выполнение, или функция может вернуть FALSE по усмотрению реализации и может измениться в будущих версиях.

Вариант isFOO_LC похож на варианты isFOO_A и isFOO_L1, но результат основан на текущей локали, что и подразумевает LC в имени. Если Perl может определить, что текущая локаль — UTF-8, он использует опубликованные правила Юникода; в противном случае он использует функцию C-библиотеки, которая предоставляет указанную классификацию. Например, isDIGIT_LC() при работе не в UTF-8 локали возвращает результат вызова isdigit(). FALSE всегда возвращается, если вход не помещается в один байт. На некоторых платформах, где функция C-библиотеки известна как дефектная, Perl изменяет свой результат, чтобы соответствовать правилам стандарта POSIX.

Вариант isFOO_LC_uvchr действует точно так же, как isFOO_LC для входов меньше 256, но для больших входов он возвращает классификацию кодового элемента Юникода.

Варианты isFOO_LC_utf8 и isFOO_LC_utf8_safe похожи на isFOO_LC_uvchr, но используются для строк с кодировкой UTF-8. Эти два варианта — разные названия одного и того же. Каждый вызов одного из этих вариантов классифицирует первый символ строки, начиная с p. Второй параметр, e, указывает на любое место в строке после первого символа, до одного байта за границами всей строки. Несмотря на то, что оба варианта идентичны, суффикс _safe в одном из названий подчёркивает, что он не будет пытаться читать за пределами e - 1, при условии, что ограничение s < e истинно (это утверждается для -DDEBUGGING сборки). Если UTF-8 для входного символа каким-либо образом некорректен, программа может прекратить выполнение, или функция может вернуть FALSE по усмотрению реализации и может измениться в будущих версиях.

isALPHA
isALPHA_A
isALPHA_L1
isALPHA_uvchr
isALPHA_utf8_safe
isALPHA_utf8
isALPHA_LC
isALPHA_LC_uvchr
isALPHA_LC_utf8_safe

Возвращает булево значение, указывающее, является ли указанный вход одним из [A-Za-z], аналогично m/[[:alpha:]]/. См. начало этого раздела для объяснения вариантов.

bool  isALPHA             (UV ch)
bool  isALPHA_A           (UV ch)
bool  isALPHA_L1          (UV ch)
bool  isALPHA_uvchr       (UV ch)
bool  isALPHA_utf8_safe   (U8 * s, U8 * end)
bool  isALPHA_utf8        (U8 * s, U8 * end)
bool  isALPHA_LC          (UV ch)
bool  isALPHA_LC_uvchr    (UV ch)
bool  isALPHA_LC_utf8_safe(U8 * s, U8 *end)
isALPHANUMERIC
isALPHANUMERIC_A
isALPHANUMERIC_L1
isALPHANUMERIC_uvchr
isALPHANUMERIC_utf8_safe
isALPHANUMERIC_utf8
isALPHANUMERIC_LC
isALPHANUMERIC_LC_uvchr
isALPHANUMERIC_LC_utf8_safe
isALNUMC
isALNUMC_A
isALNUMC_L1
isALNUMC_LC
isALNUMC_LC_uvchr

Возвращает булево значение, указывающее, является ли указанный символ одним из [A-Za-z0-9], аналогично m/[[:alnum:]]/. См. начало этого раздела для объяснения вариантов.

Синоним (не рекомендуется к использованию) — isALNUMC (где суффикс C означает, что это соответствует определению буквенно-цифровых символов языка C). Также существуют варианты isALNUMC_A, isALNUMC_L1 isALNUMC_LC, и isALNUMC_LC_uvchr.

bool  isALPHANUMERIC             (UV ch)
bool  isALPHANUMERIC_A           (UV ch)
bool  isALPHANUMERIC_L1          (UV ch)
bool  isALPHANUMERIC_uvchr       (UV ch)
bool  isALPHANUMERIC_utf8_safe   (U8 * s, U8 * end)
bool  isALPHANUMERIC_utf8        (U8 * s, U8 * end)
bool  isALPHANUMERIC_LC          (UV ch)
bool  isALPHANUMERIC_LC_uvchr    (UV ch)
bool  isALPHANUMERIC_LC_utf8_safe(U8 * s, U8 *end)
bool  isALNUMC                   (UV ch)
bool  isALNUMC_A                 (UV ch)
bool  isALNUMC_L1                (UV ch)
bool  isALNUMC_LC                (UV ch)
bool  isALNUMC_LC_uvchr          (UV ch)
isASCII
isASCII_A
isASCII_L1
isASCII_uvchr
isASCII_utf8_safe
isASCII_utf8
isASCII_LC
isASCII_LC_uvchr
isASCII_LC_utf8_safe

Возвращает булево значение, указывающее, является ли указанный символ одним из 128 символов набора символов ASCII, аналогично m/[[:ascii:]]/. На платформах, не поддерживающих ASCII, она возвращает TRUE, если этот символ соответствует символу ASCII. Варианты isASCII_A() и isASCII_L1() идентичны isASCII(). См. начало этого раздела для объяснения вариантов. Однако на некоторых платформах отсутствует функция C-библиотеки isascii(). В этих случаях варианты, имена которых содержат LC, идентичны соответствующим вариантам без них.

Обратите также внимание, что все символы ASCII инвариантны к UTF-8 (что означает, что у них есть то же самое представление (всегда один байт), независимо от того, закодированы ли они в UTF-8 или нет), isASCII даст правильные результаты, когда вызывается с любым байтом в любой строке, закодированной или нет в UTF-8. Аналогично, isASCII_utf8 и isASCII_utf8_safe будут работать правильно с любой строкой, закодированной или нет в UTF-8.

bool  isASCII             (UV ch)
bool  isASCII_A           (UV ch)
bool  isASCII_L1          (UV ch)
bool  isASCII_uvchr       (UV ch)
bool  isASCII_utf8_safe   (U8 * s, U8 * end)
bool  isASCII_utf8        (U8 * s, U8 * end)
bool  isASCII_LC          (UV ch)
bool  isASCII_LC_uvchr    (UV ch)
bool  isASCII_LC_utf8_safe(U8 * s, U8 *end)
isBLANK
isBLANK_A
isBLANK_L1
isBLANK_uvchr
isBLANK_utf8_safe
isBLANK_utf8
isBLANK_LC
isBLANK_LC_uvchr
isBLANK_LC_utf8_safe

Возвращает булево значение, указывающее, является ли указанный символ символом, считающимся пробелом, аналогично m/[[:blank:]]/. См. начало этого раздела для объяснения вариантов. Однако на некоторых платформах отсутствует функция C-библиотеки isblank(). В этих случаях варианты, имена которых содержат LC, идентичны соответствующим вариантам без них.

bool  isBLANK             (UV ch)
bool  isBLANK_A           (UV ch)
bool  isBLANK_L1          (UV ch)
bool  isBLANK_uvchr       (UV ch)
bool  isBLANK_utf8_safe   (U8 * s, U8 * end)
bool  isBLANK_utf8        (U8 * s, U8 * end)
bool  isBLANK_LC          (UV ch)
bool  isBLANK_LC_uvchr    (UV ch)
bool  isBLANK_LC_utf8_safe(U8 * s, U8 *end)
isCNTRL
isCNTRL_A
isCNTRL_L1
isCNTRL_uvchr
isCNTRL_utf8_safe
isCNTRL_utf8
isCNTRL_LC
isCNTRL_LC_uvchr
isCNTRL_LC_utf8_safe

Возвращает булево значение, указывающее, является ли указанный символ управляющим символом, аналогично m/[[:cntrl:]]/. См. начало этого раздела для объяснения вариантов. На платформах EBCDIC почти всегда следует использовать вариант isCNTRL_L1.

bool  isCNTRL             (UV ch)
bool  isCNTRL_A           (UV ch)
bool  isCNTRL_L1          (UV ch)
bool  isCNTRL_uvchr       (UV ch)
bool  isCNTRL_utf8_safe   (U8 * s, U8 * end)
bool  isCNTRL_utf8        (U8 * s, U8 * end)
bool  isCNTRL_LC          (UV ch)
bool  isCNTRL_LC_uvchr    (UV ch)
bool  isCNTRL_LC_utf8_safe(U8 * s, U8 *end)
isDIGIT
isDIGIT_A
isDIGIT_L1
isDIGIT_uvchr
isDIGIT_utf8_safe
isDIGIT_utf8
isDIGIT_LC
isDIGIT_LC_uvchr
isDIGIT_LC_utf8_safe

Возвращает булево значение, указывающее, является ли указанный символ цифрой, аналогично m/[[:digit:]]/. Варианты isDIGIT_A и isDIGIT_L1 идентичны isDIGIT. См. начало этого раздела для объяснения вариантов.

bool  isDIGIT             (UV ch)
bool  isDIGIT_A           (UV ch)
bool  isDIGIT_L1          (UV ch)
bool  isDIGIT_uvchr       (UV ch)
bool  isDIGIT_utf8_safe   (U8 * s, U8 * end)
bool  isDIGIT_utf8        (U8 * s, U8 * end)
bool  isDIGIT_LC          (UV ch)
bool  isDIGIT_LC_uvchr    (UV ch)
bool  isDIGIT_LC_utf8_safe(U8 * s, U8 *end)
isGRAPH
isGRAPH_A
isGRAPH_L1
isGRAPH_uvchr
isGRAPH_utf8_safe
isGRAPH_utf8
isGRAPH_LC
isGRAPH_LC_uvchr
isGRAPH_LC_utf8_safe

Возвращает булево значение, указывающее, является ли указанный символ графическим символом, аналогично m/[[:graph:]]/. См. начало этого раздела для объяснения вариантов.

bool  isGRAPH             (UV ch)
bool  isGRAPH_A           (UV ch)
bool  isGRAPH_L1          (UV ch)
bool  isGRAPH_uvchr       (UV ch)
bool  isGRAPH_utf8_safe   (U8 * s, U8 * end)
bool  isGRAPH_utf8        (U8 * s, U8 * end)
bool  isGRAPH_LC          (UV ch)
bool  isGRAPH_LC_uvchr    (UV ch)
bool  isGRAPH_LC_utf8_safe(U8 * s, U8 *end)
isIDCONT
isIDCONT_A
isIDCONT_L1
isIDCONT_uvchr
isIDCONT_utf8_safe
isIDCONT_utf8
isIDCONT_LC
isIDCONT_LC_uvchr
isIDCONT_LC_utf8_safe

Возвращает булево значение, указывающее, может ли указанный символ быть вторым или последующим символом идентификатора. Это очень близко к, но не совсем то же самое, что и официальное свойство Юникода XID_Continue. Разница заключается в том, что это возвращает true только в том случае, если входной символ также соответствует "isWORDCHAR". См. начало этого раздела для объяснения вариантов.

bool  isIDCONT             (UV ch)
bool  isIDCONT_A           (UV ch)
bool  isIDCONT_L1          (UV ch)
bool  isIDCONT_uvchr       (UV ch)
bool  isIDCONT_utf8_safe   (U8 * s, U8 * end)
bool  isIDCONT_utf8        (U8 * s, U8 * end)
bool  isIDCONT_LC          (UV ch)
bool  isIDCONT_LC_uvchr    (UV ch)
bool  isIDCONT_LC_utf8_safe(U8 * s, U8 *end)
isIDFIRST
isIDFIRST_A
isIDFIRST_L1
isIDFIRST_uvchr
isIDFIRST_utf8_safe
isIDFIRST_utf8
isIDFIRST_LC
isIDFIRST_LC_uvchr
isIDFIRST_LC_utf8_safe

Возвращает булево значение, указывающее, может ли указанный символ быть первым символом идентификатора. Это очень близко к, но не совсем то же самое, что и официальное свойство Юникода XID_Start. Разница заключается в том, что это возвращает true только в том случае, если входной символ также соответствует "isWORDCHAR". См. начало этого раздела для объяснения вариантов.

bool  isIDFIRST             (UV ch)
bool  isIDFIRST_A           (UV ch)
bool  isIDFIRST_L1          (UV ch)
bool  isIDFIRST_uvchr       (UV ch)
bool  isIDFIRST_utf8_safe   (U8 * s, U8 * end)
bool  isIDFIRST_utf8        (U8 * s, U8 * end)
bool  isIDFIRST_LC          (UV ch)
bool  isIDFIRST_LC_uvchr    (UV ch)
bool  isIDFIRST_LC_utf8_safe(U8 * s, U8 *end)
isLOWER
isLOWER_A
isLOWER_L1
isLOWER_uvchr
isLOWER_utf8_safe
isLOWER_utf8
isLOWER_LC
isLOWER_LC_uvchr
isLOWER_LC_utf8_safe

Возвращает булево значение, указывающее, является ли указанный символ строчной буквой, аналогично m/[[:lower:]]/. См. начало этого раздела «Классификация символов» для объяснения вариантов.

bool  isLOWER             (UV ch)
bool  isLOWER_A           (UV ch)
bool  isLOWER_L1          (UV ch)
bool  isLOWER_uvchr       (UV ch)
bool  isLOWER_utf8_safe   (U8 * s, U8 * end)
bool  isLOWER_utf8        (U8 * s, U8 * end)
bool  isLOWER_LC          (UV ch)
bool  isLOWER_LC_uvchr    (UV ch)
bool  isLOWER_LC_utf8_safe(U8 * s, U8 *end)
isOCTAL
isOCTAL_A
isOCTAL_L1

Возвращает булево значение, указывающее, является ли указанный символ восьмеричной цифрой [0-7]. Единственные два варианта — isOCTAL_A и isOCTAL_L1; каждый из них идентичен isOCTAL.

bool  isOCTAL(UV ch)
isPRINT
isPRINT_A
isPRINT_L1
isPRINT_uvchr
isPRINT_utf8_safe
isPRINT_utf8
isPRINT_LC
isPRINT_LC_uvchr
isPRINT_LC_utf8_safe

Возвращает булево значение, указывающее, является ли указанный символ печатным символом, аналогично m/[[:print:]]/. См. начало этого раздела «Классификация символов» для объяснения вариантов.

bool  isPRINT             (UV ch)
bool  isPRINT_A           (UV ch)
bool  isPRINT_L1          (UV ch)
bool  isPRINT_uvchr       (UV ch)
bool  isPRINT_utf8_safe   (U8 * s, U8 * end)
bool  isPRINT_utf8        (U8 * s, U8 * end)
bool  isPRINT_LC          (UV ch)
bool  isPRINT_LC_uvchr    (UV ch)
bool  isPRINT_LC_utf8_safe(U8 * s, U8 *end)
isPSXSPC
isPSXSPC_A
isPSXSPC_L1
isPSXSPC_uvchr
isPSXSPC_utf8_safe
isPSXSPC_utf8
isPSXSPC_LC
isPSXSPC_LC_uvchr
isPSXSPC_LC_utf8_safe

(сокращенно Posix Space) Начиная с версии 5.18, это идентично во всех своих формах соответствующим макросам isSPACE(). Локальные формы этого макроса идентичны соответствующим формам isSPACE() во всех выпусках Perl. В выпусках до 5.18 формы без локали отличаются от своих форм isSPACE() только тем, что формы isSPACE() не соответствуют вертикальной табуляции, а формы isPSXSPC() соответствуют. В остальном они идентичны. Таким образом, этот макрос аналогичен тому, что m/[[:space:]]/ соответствует в регулярном выражении. См. начало этого раздела «Классификация символов» для объяснения вариантов.

bool  isPSXSPC             (UV ch)
bool  isPSXSPC_A           (UV ch)
bool  isPSXSPC_L1          (UV ch)
bool  isPSXSPC_uvchr       (UV ch)
bool  isPSXSPC_utf8_safe   (U8 * s, U8 * end)
bool  isPSXSPC_utf8        (U8 * s, U8 * end)
bool  isPSXSPC_LC          (UV ch)
bool  isPSXSPC_LC_uvchr    (UV ch)
bool  isPSXSPC_LC_utf8_safe(U8 * s, U8 *end)
isPUNCT
isPUNCT_A
isPUNCT_L1
isPUNCT_uvchr
isPUNCT_utf8_safe
isPUNCT_utf8
isPUNCT_LC
isPUNCT_LC_uvchr
isPUNCT_LC_utf8_safe

Возвращает булево значение, указывающее, является ли указанный символ пунктуационным символом, аналогично m/[[:punct:]]/. Обратите внимание, что определение того, что является пунктуацией, не так просто, как хотелось бы. Подробности см. в "POSIX Character Classes" в perlrecharclass. См. начало этого раздела «Классификация символов» для объяснения вариантов.

bool  isPUNCT             (UV ch)
bool  isPUNCT_A           (UV ch)
bool  isPUNCT_L1          (UV ch)
bool  isPUNCT_uvchr       (UV ch)
bool  isPUNCT_utf8_safe   (U8 * s, U8 * end)
bool  isPUNCT_utf8        (U8 * s, U8 * end)
bool  isPUNCT_LC          (UV ch)
bool  isPUNCT_LC_uvchr    (UV ch)
bool  isPUNCT_LC_utf8_safe(U8 * s, U8 *end)
isSPACE
isSPACE_A
isSPACE_L1
isSPACE_uvchr
isSPACE_utf8_safe
isSPACE_utf8
isSPACE_LC
isSPACE_LC_uvchr
isSPACE_LC_utf8_safe

Возвращает булево значение, указывающее, является ли указанный символ символом пробела. Это аналогично тому, что m/\s/ соответствует в регулярном выражении. Начиная с Perl 5.18, это также соответствует тому, что m/[[:space:]]/ делает. До версии 5.18 только локальные формы этого макроса (те, у которых в имени есть LC) точно соответствовали тому, что m/[[:space:]]/ делает. В этих выпусках единственное различие в вариантах без локали заключалось в том, что isSPACE() не соответствовал вертикальной табуляции. (См. "isPSXSPC" для макроса, который соответствует вертикальной табуляции во всех выпусках.) См. начало этого раздела «Классификация символов» для объяснения вариантов.

bool  isSPACE             (UV ch)
bool  isSPACE_A           (UV ch)
bool  isSPACE_L1          (UV ch)
bool  isSPACE_uvchr       (UV ch)
bool  isSPACE_utf8_safe   (U8 * s, U8 * end)
bool  isSPACE_utf8        (U8 * s, U8 * end)
bool  isSPACE_LC          (UV ch)
bool  isSPACE_LC_uvchr    (UV ch)
bool  isSPACE_LC_utf8_safe(U8 * s, U8 *end)
isUPPER
isUPPER_A
isUPPER_L1
isUPPER_uvchr
isUPPER_utf8_safe
isUPPER_utf8
isUPPER_LC
isUPPER_LC_uvchr
isUPPER_LC_utf8_safe

Возвращает булево значение, указывающее, является ли указанный символ заглавной буквой, аналогично m/[[:upper:]]/. См. начало этого раздела «Классификация символов» для объяснения вариантов.

bool  isUPPER             (UV ch)
bool  isUPPER_A           (UV ch)
bool  isUPPER_L1          (UV ch)
bool  isUPPER_uvchr       (UV ch)
bool  isUPPER_utf8_safe   (U8 * s, U8 * end)
bool  isUPPER_utf8        (U8 * s, U8 * end)
bool  isUPPER_LC          (UV ch)
bool  isUPPER_LC_uvchr    (UV ch)
bool  isUPPER_LC_utf8_safe(U8 * s, U8 *end)
isWORDCHAR
isWORDCHAR_A
isWORDCHAR_L1
isWORDCHAR_uvchr
isWORDCHAR_utf8_safe
isWORDCHAR_utf8
isWORDCHAR_LC
isWORDCHAR_LC_uvchr
isWORDCHAR_LC_utf8_safe
isALNUM
isALNUM_A
isALNUM_LC
isALNUM_LC_uvchr

Возвращает булево значение, указывающее, является ли указанный символ символом слова, аналогично тому, что m/\w/ и m/[[:word:]]/ соответствуют в регулярном выражении. Символ слова — это буквенный символ, десятичная цифра, соединительный пунктуационный символ (например, нижнее подчёркивание) или символ «метки», который прикрепляется к одному из них (например, некоторые типы диакритики). isALNUM() — синоним, предоставленный для обратной совместимости, хотя символ слова включает в себя больше, чем стандартное значение символа в языке C. См. начало этого раздела «Классификация символов» для объяснения вариантов. isWORDCHAR_A, isWORDCHAR_L1, isWORDCHAR_uvchr, isWORDCHAR_LC, isWORDCHAR_LC_uvchr, isWORDCHAR_LC_utf8, и isWORDCHAR_LC_utf8_safe также, как описано там, но дополнительно включают в себя нативное нижнее подчёркивание платформы.

bool  isWORDCHAR             (UV ch)
bool  isWORDCHAR_A           (UV ch)
bool  isWORDCHAR_L1          (UV ch)
bool  isWORDCHAR_uvchr       (UV ch)
bool  isWORDCHAR_utf8_safe   (U8 * s, U8 * end)
bool  isWORDCHAR_utf8        (U8 * s, U8 * end)
bool  isWORDCHAR_LC          (UV ch)
bool  isWORDCHAR_LC_uvchr    (UV ch)
bool  isWORDCHAR_LC_utf8_safe(U8 * s, U8 *end)
bool  isALNUM                (UV ch)
bool  isALNUM_A              (UV ch)
bool  isALNUM_LC             (UV ch)
bool  isALNUM_LC_uvchr       (UV ch)
isXDIGIT
isXDIGIT_A
isXDIGIT_L1
isXDIGIT_uvchr
isXDIGIT_utf8_safe
isXDIGIT_utf8
isXDIGIT_LC
isXDIGIT_LC_uvchr
isXDIGIT_LC_utf8_safe

Возвращает булево значение, указывающее, является ли указанный символ шестнадцатеричной цифрой. В диапазоне ASCII это [0-9A-Fa-f]. Варианты isXDIGIT_A() и isXDIGIT_L1() идентичны isXDIGIT(). См. начало этого раздела «Классификация символов» для объяснения вариантов.

bool  isXDIGIT             (UV ch)
bool  isXDIGIT_A           (UV ch)
bool  isXDIGIT_L1          (UV ch)
bool  isXDIGIT_uvchr       (UV ch)
bool  isXDIGIT_utf8_safe   (U8 * s, U8 * end)
bool  isXDIGIT_utf8        (U8 * s, U8 * end)
bool  isXDIGIT_LC          (UV ch)
bool  isXDIGIT_LC_uvchr    (UV ch)
bool  isXDIGIT_LC_utf8_safe(U8 * s, U8 *end)

Сведения о компиляторе и препроцессоре

CPPLAST

Этот символ предназначен для использования вместе с CPPRUN аналогично тому, как используется символ CPPMINUS с CPPSTDIN. Содержит либо "-" либо ""

CPPMINUS

Этот символ содержит вторую часть строки, которая вызовет препроцессор C на стандартном входе и выведет на стандартный выход. Этот символ будет иметь значение "-" если CPPSTDIN требует минуса для указания стандартного ввода, иначе значение — "".

CPPRUN

Этот символ содержит строку, которая вызовет препроцессор C на стандартном входе и выведет на стандартный выход. Она должна заканчиваться CPPLAST, после того как были указаны все другие флаги препроцессора. Главное различие с CPPSTDIN заключается в том, что эта программа никогда не будет указателем на оболочку shell, т.е. она будет пустой, если препроцессор не доступен пользователю напрямую. Обратите внимание, что она может отличаться от препроцессора, используемого для компиляции программы C.

CPPSTDIN

Этот символ содержит первую часть строки, которая вызовет препроцессор C на стандартном входе и выведет на стандартный выход. Типичное значение "cc -E" или "/lib/cpp", но также может вызывать оболочку. См. "CPPRUN".

HASATTRIBUTE_ALWAYS_INLINE

Можем ли мы обработать атрибут GCC для функций, которые всегда должны быть встроены?

HASATTRIBUTE_DEPRECATED

Можем ли мы обработать атрибут GCC для маркировки устаревших APIs?

HASATTRIBUTE_FORMAT

Можем ли мы обработать атрибут GCC для проверки форматов в стиле printf?

HASATTRIBUTE_NONNULL

Можем ли мы обработать атрибут GCC для параметров функций nonnull?

HASATTRIBUTE_NORETURN

Можем ли мы обработать атрибут GCC для функций, которые не возвращают значения?

HASATTRIBUTE_PURE

Можем ли мы обработать атрибут GCC для чистых функций?

HASATTRIBUTE_UNUSED

Можем ли мы обработать атрибут GCC для неиспользуемых переменных и аргументов?

HASATTRIBUTE_WARN_UNUSED_RESULT

Можем ли мы обработать атрибут GCC для вывода предупреждения об использовании результата?

HAS_BUILTIN_ADD_OVERFLOW

Если этот символ определен, это означает, что компилятор поддерживает __builtin_add_overflow для сложения целых чисел с проверкой переполнения.

HAS_BUILTIN_CHOOSE_EXPR

Можем ли мы обработать встроенную функцию GCC для условных выражений на этапе компиляции?

HAS_BUILTIN_EXPECT

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

HAS_BUILTIN_MUL_OVERFLOW

Если этот символ определен, это означает, что компилятор поддерживает __builtin_mul_overflow для умножения целых чисел с проверкой переполнения.

END_OF_DOCUMENT_MARKER
HAS_BUILTIN_SUB_OVERFLOW

Этот символ, если определён, указывает, что компилятор поддерживает __builtin_sub_overflow для вычитания целых чисел с проверкой переполнения.

HAS_C99_VARIADIC_MACROS

Если определён, компилятор поддерживает C99 вариативные макросы.

HAS_STATIC_INLINE

Этот символ, если определён, указывает, что компилятор C поддерживает статические inline функции в стиле C99. То есть, к функции нельзя обратиться из другого трансляционного блока.

MEM_ALIGNBYTES

Этот символ содержит количество байтов, необходимое для выравнивания типа double, или long double, если применимо. Обычные значения — 2, 4 и 8. По умолчанию используется восемь, для безопасности. Для кросс-компиляции или поддержки нескольких архитектур Configure установит минимум 8.

PERL_STATIC_INLINE

Этот символ содержит наилучшее предположение о том, как использовать статические inline функции. Если HAS_STATIC_INLINE определено, это обеспечит использование inline в стиле C99. Если HAS_STATIC_INLINE не определено, это будет просто 'static'. Он всегда будет определён для получения статической связи. Возможные варианты:

static inline       (c99)
static __inline__   (gcc -ansi)
static __inline     (MSVC)
static _inline      (older MSVC)
static              (c89 compilers)
PERL_THREAD_LOCAL

Этот символ, если определён, указывает спецификацию связи для локального хранения потоков. Например, для компилятора C11 это будет _Thread_local. Следует быть осторожным, некоторые компиляторы чувствительны к стандарту языка C, который им сообщается для анализа. Например, suncc по умолчанию использует C11, поэтому наш запрос покажет, что _Thread_local может быть использован. Однако, если позже к флагам компилятора будет добавлен -std=c99, то _Thread_local станет синтаксической ошибкой. Поэтому важно, чтобы эти флаги были согласованы между запросом и использованием.

U32_ALIGNMENT_REQUIRED

Этот символ, если определён, указывает, что вам необходимо обращаться к данным символьного типа через указатели, выровненные по U32.

Директивы компилятора

ASSUME

ASSUME подобно assert(), но имеет преимущества в релизной сборке. Это подсказка для компилятора о факте, заявленном в выражении вызова функции, что позволяет компилятору генерировать более эффективный машинный код. В отладочной сборке ASSUME(x) является синонимом assert(x). ASSUME(0) означает, что путь выполнения недостижим. В цикле for, ASSUME можно использовать для указания, что цикл выполнится как минимум X раз. ASSUME основано на внутренней функции MSVC's __assume, см. её документацию для получения более подробной информации.

ASSUME(bool expr)
dNOOP

Не объявляет ничего; обычно используется в качестве заполнителя для замены чего-то, что раньше объявляло что-то. Работает с компиляторами, которые требуют объявлений перед любым кодом.

dNOOP;
END_EXTERN_C

Если не компилируется с использованием C++, расширяется до ничего. В противном случае завершает раздел кода, начатый директивой "START_EXTERN_C".

END_EXTERN_C
EXTERN_C

Если не компилируется с использованием C++, расширяется до ничего. В противном случае используется в объявлении функции для указания, что функция должна иметь внешнюю связь C. Это необходимо для работы практически всех функций с внешней связью, скомпилированных в Perl. Часто вы можете использовать "START_EXTERN_C" ... "END_EXTERN_C" блоки, окружающие весь код, для которого нужна такая связь.

Пример использования:

EXTERN_C int flock(int fd, int op);
LIKELY

Возвращает входные данные без изменений, но в то же время даёт компилятору подсказку по предсказанию ветвления, что данное условие, скорее всего, истинно.

LIKELY(bool expr)
NOOP

Не делать ничего; обычно используется в качестве заполнителя для замены чего-то, что раньше делало что-то.

NOOP;
PERL_UNUSED_ARG

Используется для подавления предупреждений компилятора о том, что параметр функции не используется. Эта ситуация может возникнуть, например, когда параметр необходим в одних условиях конфигурации, но не в других, поэтому условное компилирование с помощью препроцессора C приводит к тому, что он используется только в некоторых случаях.

PERL_UNUSED_ARG(void x);
PERL_UNUSED_CONTEXT

Используется для подавления предупреждений компилятора о том, что параметр контекста потока функции не используется. Эта ситуация может возникнуть, например, когда условное компилирование с помощью препроцессора C приводит к тому, что он используется только в некоторых случаях.

PERL_UNUSED_CONTEXT;
PERL_UNUSED_DECL

Сообщает компилятору, что параметр в прототипе функции, расположенный перед ним, не обязательно должен использоваться в функции. Не так много компиляторов понимают это, поэтому использовать это следует только в случаях, когда "PERL_UNUSED_ARG" не может быть удобно использовано.

Пример использования:

Signal_t
Perl_perly_sighandler(int sig, Siginfo_t *sip PERL_UNUSED_DECL,
                      void *uap PERL_UNUSED_DECL, bool safe)
PERL_UNUSED_RESULT

Этот макрос указывает компилятору игнорировать возвращаемое значение вызова функции внутри него, например,

PERL_UNUSED_RESULT(foo(a, b))

Основной причиной является то, что сочетание gcc -Wunused-result (часть -Wall) и __attribute__((warn_unused_result)) не может быть устранено приведением к void. Это создаёт проблемы, когда системные заголовочные файлы используют этот атрибут.

Однако используйте PERL_UNUSED_RESULT экономно, поскольку обычно предупреждение возникает по хорошей причине: вы можете потерять информацию об успехе/неуспехе, утечку ресурсов или изменения в ресурсах.

Но иногда вы просто хотите проигнорировать возвращаемое значение, например, в ветвях кода, которые скоро завершатся прерыванием, или в попытках "лучшего усилия", или в ситуациях, когда нет хорошего способа обработать ошибки.

Иногда PERL_UNUSED_RESULT может быть не самым естественным способом: другой вариант — поймать возвращаемое значение и использовать "PERL_UNUSED_VAR" на нём.

PERL_UNUSED_RESULT(void x)
PERL_UNUSED_VAR

Используется для подавления предупреждений компилятора о том, что переменная x не используется. Эта ситуация может возникнуть, например, когда условное компилирование с помощью препроцессора C приводит к тому, что она используется только в некоторых случаях.

PERL_UNUSED_VAR(void x);
PERL_USE_GCC_BRACE_GROUPS

Если это значение препроцессора C определено, это означает, что разрешено использование расширения GCC brace groups. Это расширение в форме

({ statement ... })

преобразует блок, состоящий из инструкций ..., в выражение со значением, в отличие от обычных блоков языка C. Это может открыть возможности для оптимизации, НО вам обычно нужно указать альтернативу на случай, если эта возможность отсутствует или запрещена по другим причинам.

Пример использования:

#ifdef PERL_USE_GCC_BRACE_GROUPS
  ...
#else
  ...
#endif
START_EXTERN_C

Если не компилируется с использованием C++, расширяется до ничего. В противном случае начинает раздел кода, в котором к каждой функции эффективно применяется "EXTERN_C", то есть устанавливается внешняя связь C. Раздел завершается "END_EXTERN_C".

START_EXTERN_C
STATIC

Описано в perlguts.

STMT_START
STMT_END

Это позволяет использовать серию инструкций в макросе как одну инструкцию, как в

if (x) STMT_START { ... } STMT_END else ...

Обратите внимание, что вы не можете вернуть значение из них, что ограничивает их полезность. Но см. "PERL_USE_GCC_BRACE_GROUPS".

UNLIKELY

Возвращает входные данные без изменений, но в то же время даёт компилятору подсказку по предсказанию ветвления, что данное условие, скорее всего, ложно.

UNLIKELY(bool expr)
__ASSERT_

Это вспомогательный макрос для избежания проблем с препроцессором, заменяемый ничем, если не включена отладка, где он расширяется до проверки её аргумента, за которым следует запятая (поэтому оператор запятой). Если мы просто использовали бы assert(), мы получили бы запятую без чего-либо перед ней, когда не включена отладка.

__ASSERT_(bool expr)

Обработка областей компиляции во время компиляции

BhkDISABLE

ПРИМЕЧАНИЕ: BhkDISABLE является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Временно отключить запись в этой структуре BHK, сбросив соответствующий флаг. which — маркер препроцессора, указывающий, какую запись отключить.

void  BhkDISABLE(BHK *hk, which)
BhkENABLE

ПРИМЕЧАНИЕ: BhkENABLE является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Включить запись в этой структуре BHK, установив соответствующий флаг. which — маркер препроцессора, указывающий, какую запись включить. Это вызовет ошибку (при -DDEBUGGING), если запись не содержит действительного указателя.

void  BhkENABLE(BHK *hk, which)
BhkENTRY_set

ПРИМЕЧАНИЕ: BhkENTRY_set является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Установить запись в структуру BHK и установить флаги, чтобы указать, что она действительна. which — маркер препроцессора, указывающий, какую запись установить. Тип ptr зависит от записи.

void  BhkENTRY_set(BHK *hk, which, void *ptr)
blockhook_register

ПРИМЕЧАНИЕ: blockhook_register является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Зарегистрировать набор хуков, которые будут вызываться при изменении лексического контекста Perl во время компиляции. См. "Обработка областей компиляции во время компиляции" в perlguts.

ПРИМЕЧАНИЕ: blockhook_register должен быть явно вызван как Perl_blockhook_register с параметром aTHX_.

void  Perl_blockhook_register(pTHX_ BHK *hk)

Конкурентность

aTHX

Описано в perlguts.

aTHX_

Описано в perlguts.

CPERLscope

DEPRECATED! Планируется удалить CPERLscope из будущих релизов Perl. Не используйте его для нового кода; удалите его из существующего кода.

Теперь — не операция.

void  CPERLscope(void x)
dTHR

Описано в perlguts.

dTHX

Описано в perlguts.

dTHXa

В многопоточных Perl, установите pTHX в a; в однопоточных Perl — ничего не делайте.

dTHXoa

Теперь синоним для "dTHXa".

dVAR

Теперь синоним для dNOOP: не объявлять ничего.

END_OF_DOCUMENT_MARKER
GETENV_PRESERVES_OTHER_THREAD

Этот символ, если он определён, указывает, что системный вызов getenv не очищает статический буфер getenv() в другом потоке. Типичная реализация getenv() вернёт указатель на правильное положение в **environ. Но некоторые могут вместо этого скопировать их в статический буфер в getenv(). Если существует экземпляр этого буфера на поток или возврат указывает на **environ, то подойдёт мьютекс с множеством читателей/одним писателем; в противном случае потребуется мьютекс с эксклюзивным блокированием, чтобы избежать гонок.

HAS_PTHREAD_ATFORK

Этот символ, если он определён, указывает, что процедура pthread_atfork доступна для настройки обработчиков fork.

HAS_PTHREAD_ATTR_SETSCOPE

Этот символ, если он определён, указывает, что системный вызов pthread_attr_setscope доступен для установки атрибута области конфликта объекта атрибутов потока.

HAS_PTHREAD_YIELD

Этот символ, если он определён, указывает, что процедура pthread_yield доступна для уступки выполнения текущего потока. sched_yield предпочтительнее pthread_yield.

HAS_SCHED_YIELD

Этот символ, если он определён, указывает, что процедура sched_yield доступна для уступки выполнения текущего потока. sched_yield предпочтительнее pthread_yield.

I_MACH_CTHREADS

Этот символ, если он определён, указывает C-программе, что она должна включить mach/cthreads.h.

#ifdef I_MACH_CTHREADS
    #include <mach_cthreads.h>
#endif
I_PTHREAD

Этот символ, если он определён, указывает C-программе, что она должна включить pthread.h.

#ifdef I_PTHREAD
    #include <pthread.h>
#endif
MULTIPLICITY

Этот символ, если он определён, указывает, что Perl должен быть скомпилирован с использованием множественности.

OLD_PTHREADS_API

Этот символ, если он определён, указывает, что Perl должен быть скомпилирован с использованием старой черновой POSIX потоковой API API.

OLD_PTHREAD_CREATE_JOINABLE

Если этот символ определён, он указывает способ создания потока pthread в присоединяемом (также известном как неоткреплённом) состоянии. NOTE: не определён, если в pthread.h уже определён PTHREAD_CREATE_JOINABLE (новая версия константы). Если определён, известные значения — PTHREAD_CREATE_UNDETACHED и __UNDETACHED.

PERL_IMPLICIT_CONTEXT

Описание в perlguts.

pTHX

Описание в perlguts.

pTHX_

Описание в perlguts.

SCHED_YIELD

Этот символ определяет способ уступки выполнения текущего потока. Известные способы — sched_yield, pthread_yield, и pthread_yield с NULL.

COPs и хэши подсказок

cop_fetch_label

ПРИМЕЧАНИЕ: cop_fetch_label — экспериментальная функция и может быть изменена или удалена без предварительного уведомления.

Возвращает метку, присоединённую к COP, и сохраняет её длину в байтах в *len. После возврата *flags будет установлено либо на SVf_UTF8, либо на 0.

В качестве альтернативы используйте макрос "CopLABEL_len_flags"; или, если вам не нужно знать, является ли метка UTF-8, используйте макрос "CopLABEL_len"; или, если вам не нужна длина, используйте "CopLABEL".

const char *  cop_fetch_label(COP *const cop, STRLEN *len,
                              U32 *flags)
CopFILE

Возвращает имя файла, связанного с COP c.

const char *  CopFILE(const COP * c)
CopFILEAV

Возвращает AV, связанный с COP c, создавая его при необходимости.

AV *  CopFILEAV(const COP * c)
CopFILEAVn

Возвращает AV, связанный с COP c, возвращая NULL, если его ещё нет.

AV *  CopFILEAVn(const COP * c)
CopFILEGV

Возвращает GV, связанный с COP c.

GV *  CopFILEGV(const COP * c)
CopFILEGV_set

Доступно только в однопоточных Perl. Устанавливает pv как имя файла, связанного с COP c.

void  CopFILEGV_set(COP * c, GV * gv)
CopFILE_set

Устанавливает pv как имя файла, связанного с COP c.

void  CopFILE_set(COP * c, const char * pv)
CopFILESV

Возвращает SV, связанный с COP c.

SV *  CopFILESV(const COP * c)
cophh_2hv

ПРИМЕЧАНИЕ: cophh_2hv — экспериментальная функция и может быть изменена или удалена без предварительного уведомления.

Генерирует и возвращает стандартный Perl-хэш, представляющий полный набор пар ключ/значение в хэше подсказок cop cophh. flags в настоящее время не используется и должно быть равно нулю.

HV *  cophh_2hv(const COPHH *cophh, U32 flags)
cophh_copy

ПРИМЕЧАНИЕ: cophh_copy — экспериментальная функция и может быть изменена или удалена без предварительного уведомления.

Создаёт и возвращает полную копию хэша подсказок cop cophh.

COPHH *  cophh_copy(COPHH *cophh)
cophh_delete_pvn
cophh_delete_pv
cophh_delete_pvs
cophh_delete_sv

ПРИМЕЧАНИЕ: все эти функции — экспериментальные и могут быть изменены или удалены без предварительного уведомления.

Удаляют ключ и связанное с ним значение из хэша подсказок cop cophh, и возвращают изменённый хэш. Возвращаемый указатель на хэш, как правило, не совпадает с указателем на хэш, который был передан на вход. Входной хэш потребляется функцией, и указатель на него не должен использоваться в дальнейшем. Если вам нужно сохранить оба хэша, используйте "cophh_copy".

Различия в функциях заключаются в способе указания ключа. Во всех формах ключ указывается с помощью key. В простой форме pv, ключ — это C-строка с завершающим нулём. В форме pvs, ключ — это C-строковая константа. В форме pvn, дополнительный параметр keylen указывает длину строки, которая может содержать вложенные нули. В форме sv, *key — это SV, и ключ — это PV, извлечённый из него, используя "SvPV_const".

hash — предварительно вычисленный хэш строки ключа или ноль, если он не был предварительно вычислен. Этот параметр опущен в форме pvs, так как он вычисляется автоматически во время компиляции.

Единственный флаг, используемый в параметре flags, — COPHH_KEY_UTF8. В форме sv его нельзя устанавливать. В формах pv*, он указывает, интерпретируются ли байты ключа как UTF-8 (если установлен), или как Latin-1 (если сброшен). Форма sv использует подлежащий SV для определения UTF-8-ности байтов.

COPHH *  cophh_delete_pvn(COPHH *cophh, const char *key,
                          STRLEN keylen, U32 hash, U32 flags)
COPHH *  cophh_delete_pv (COPHH *cophh, const char *key, U32 hash,
                          U32 flags)
COPHH *  cophh_delete_pvs(COPHH *cophh, "key", U32 flags)
COPHH *  cophh_delete_sv (COPHH *cophh, SV *key, U32 hash,
                          U32 flags)
cophh_exists_pvn

ПРИМЕЧАНИЕ: cophh_exists_pvn — экспериментальная функция и может быть изменена или удалена без предварительного уведомления.

Эти функции ищут запись подсказки в COP cop с ключом, заданным key (и keylen в форме pvn), возвращая true, если значение существует, и false в противном случае.

Различия в функциях заключаются в способе указания ключа. В простой форме pv, ключ — это C-строка с завершающим нулём. В форме pvs, ключ — это C-строковая константа. В форме pvn, дополнительный параметр keylen указывает длину строки, которая может содержать вложенные нули. В форме sv, *key — это SV, и ключ — это PV, извлечённый из него, используя "SvPV_const".

hash — предварительно вычисленный хэш строки ключа или ноль, если он не был предварительно вычислен. Этот параметр опущен в форме pvs, так как он вычисляется автоматически во время компиляции.

Единственный флаг, используемый в параметре flags, — COPHH_KEY_UTF8. В форме sv его нельзя устанавливать. В формах pv*, он указывает, интерпретируются ли байты ключа как UTF-8 (если установлен), или как Latin-1 (если сброшен). Форма sv использует подлежащий SV для определения UTF-8-ности байтов.

bool  cophh_exists_pvn(const COPHH *cophh, const char *key,
                       STRLEN keylen, U32 hash, U32 flags)
cophh_fetch_pvn
cophh_fetch_pv
cophh_fetch_pvs
cophh_fetch_sv

ПРИМЕЧАНИЕ: все эти функции — экспериментальные и могут быть изменены или удалены без предварительного уведомления.

Эти функции ищут запись в хэше подсказок COP cophh с ключом, заданным key (и keylen в форме pvn), возвращая копию смертного скаляра этого значения или &PL_sv_placeholder, если сохранённого значения нет.

Различия в функциях заключаются в способе указания ключа. В простой форме pv, ключ — это C-строка с завершающим нулём. В форме pvs, ключ — это C-строковая константа. В форме pvn, дополнительный параметр keylen указывает длину строки, которая может содержать вложенные нули. В форме sv, *key — это SV, и ключ — это PV, извлечённый из него, используя "SvPV_const".

hash — предварительно вычисленный хэш строки ключа или ноль, если он не был предварительно вычислен. Этот параметр опущен в форме pvs, так как он вычисляется автоматически во время компиляции.

Единственный флаг, используемый в параметре flags, — COPHH_KEY_UTF8. В форме sv его нельзя устанавливать. В формах pv*, он указывает, интерпретируются ли байты ключа как UTF-8 (если установлен), или как Latin-1 (если сброшен). Форма sv использует подлежащий SV для определения UTF-8-ности байтов.

SV *  cophh_fetch_pvn(const COPHH *cophh, const char *key,
                      STRLEN keylen, U32 hash, U32 flags)
SV *  cophh_fetch_pv (const COPHH *cophh, const char *key,
                      U32 hash, U32 flags)
SV *  cophh_fetch_pvs(const COPHH *cophh, "key", U32 flags)
SV *  cophh_fetch_sv (const COPHH *cophh, SV *key, U32 hash,
                      U32 flags)
cophh_free

ПРИМЕЧАНИЕ: cophh_free — экспериментальная функция и может быть изменена или удалена без предварительного уведомления.

Удаляет хэш подсказок COP cophh, освобождая все ресурсы, связанные с ним.

void  cophh_free(COPHH *cophh)
cophh_new_empty

ПРИМЕЧАНИЕ: cophh_new_empty является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Создаёт и возвращает новый хеш cop hints, не содержащий записей.

COPHH *  cophh_new_empty()
cophh_store_pvn
cophh_store_pv
cophh_store_pvs
cophh_store_sv

ПРИМЕЧАНИЕ: все эти формы являются экспериментальными и могут быть изменены или удалены без предварительного уведомления.

Эти функции сохраняют значение, связанное с ключом, в хеше cop hints cophh, и возвращают изменённый хеш. Указатель на возвращаемый хеш, как правило, отличается от указателя на хеш, переданный в функцию. Входной хеш потребляется функцией, и указатель на него не должен использоваться в дальнейшем. Используйте "cophh_copy", если вам нужен и исходный, и изменённый хеш.

value — это скалярное значение, которое необходимо сохранить для данного ключа. value копируется этими функциями, которые, таким образом, не принимают на себя ответственность за любые ссылки на него, и поэтому последующие изменения скаляра не будут отражены в значении, видимом в хеше cop hints. Сложные типы скаляров не будут храниться с целостностью ссылок, а будут приведены к строкам.

Формы различаются тем, как задаётся ключ. Во всех формах ключ указывается через key. В форме pv, ключ — это строка C с завершением нулём. В форме pvs, ключ — это строковая константа языка C. В форме pvn, дополнительный параметр keylen указывает длину строки, которая может содержать вложенные нули. В форме sv, *key — это SV, а ключ — это PV, извлечённый из него, используя "SvPV_const".

hash — это предварительно вычисленный хеш строки ключа или ноль, если он не был предварительно вычислен. Этот параметр опущен в форме pvs, так как он вычисляется автоматически во время компиляции.

Из параметра flags в настоящее время используется только параметр COPHH_KEY_UTF8. Недопустимо устанавливать этот параметр в форме sv. В формах pv*, он указывает, интерпретируются ли байты ключа как UTF-8 (если установлен) или как Latin-1 (если сброшен). Форма sv использует подлежащий SV для определения UTF-8-ности байтов.

COPHH *  cophh_store_pvn(COPHH *cophh, const char *key,
                         STRLEN keylen, U32 hash, SV *value,
                         U32 flags)
COPHH *  cophh_store_pv (COPHH *cophh, const char *key, U32 hash,
                         SV *value, U32 flags)
COPHH *  cophh_store_pvs(COPHH *cophh, "key", SV *value,
                         U32 flags)
COPHH *  cophh_store_sv (COPHH *cophh, SV *key, U32 hash,
                         SV *value, U32 flags)
cop_hints_2hv

Генерирует и возвращает стандартный perl-хеш, представляющий полный набор записей подсказок в cop cop. flags в настоящее время не используется и должен быть равен нулю.

HV *  cop_hints_2hv(const COP *cop, U32 flags)
cop_hints_exists_pvn
cop_hints_exists_pv
cop_hints_exists_pvs
cop_hints_exists_sv

Эти функции ищут запись подсказки в cop cop с ключом, указанным в key (и keylen в форме pvn). Они возвращают true, если значение существует, и false в противном случае.

Формы различаются тем, как задаётся ключ. Во всех формах ключ указывается через key. В форме pv, ключ — это строка C с завершением нулём. В форме pvs, ключ — это строковая константа языка C. В форме pvn, дополнительный параметр keylen указывает длину строки, которая может содержать вложенные нули. В форме sv, *key — это SV, а ключ — это PV, извлечённый из него, используя "SvPV_const".

hash — это предварительно вычисленный хеш строки ключа или ноль, если он не был предварительно вычислен. Этот параметр опущен в форме pvs, так как он вычисляется автоматически во время компиляции.

Из параметра flags в настоящее время используется только параметр COPHH_KEY_UTF8. Недопустимо устанавливать этот параметр в форме sv. В формах pv*, он указывает, интерпретируются ли байты ключа как UTF-8 (если установлен) или как Latin-1 (если сброшен). Форма sv использует подлежащий SV для определения UTF-8-ности байтов.

bool  cop_hints_exists_pvn(const COP *cop, const char *key,
                           STRLEN keylen, U32 hash, U32 flags)
bool  cop_hints_exists_pv (const COP *cop, const char *key,
                           U32 hash, U32 flags)
bool  cop_hints_exists_pvs(const COP *cop, "key", U32 flags)
bool  cop_hints_exists_sv (const COP *cop, SV *key, U32 hash,
                           U32 flags)
cop_hints_fetch_pvn
cop_hints_fetch_pv
cop_hints_fetch_pvs
cop_hints_fetch_sv

Эти функции ищут запись подсказки в cop cop с ключом, указанным в key (и keylen в форме pvn). Они возвращают копию значения, или &PL_sv_placeholder , если значение, связанное с ключом, отсутствует.

Формы различаются тем, как задаётся ключ. В форме pv, ключ — это строка C с завершением нулём. В форме pvs, ключ — это строковая константа языка C. В форме pvn, дополнительный параметр keylen указывает длину строки, которая может содержать вложенные нули. В форме sv, *key — это SV, а ключ — это PV, извлечённый из него, используя "SvPV_const".

hash — это предварительно вычисленный хеш строки ключа или ноль, если он не был предварительно вычислен. Этот параметр опущен в форме pvs, так как он вычисляется автоматически во время компиляции.

Из параметра flags в настоящее время используется только параметр COPHH_KEY_UTF8. Недопустимо устанавливать этот параметр в форме sv. В формах pv*, он указывает, интерпретируются ли байты ключа как UTF-8 (если установлен) или как Latin-1 (если сброшен). Форма sv использует подлежащий SV для определения UTF-8-ности байтов.

SV *  cop_hints_fetch_pvn(const COP *cop, const char *key,
                          STRLEN keylen, U32 hash, U32 flags)
SV *  cop_hints_fetch_pv (const COP *cop, const char *key,
                          U32 hash, U32 flags)
SV *  cop_hints_fetch_pvs(const COP *cop, "key", U32 flags)
SV *  cop_hints_fetch_sv (const COP *cop, SV *key, U32 hash,
                          U32 flags)
CopLABEL
CopLABEL_len
CopLABEL_len_flags

Эти функции возвращают метку, прикреплённую к cop.

CopLABEL_len и CopLABEL_len_flags дополнительно сохраняют количество байтов, составляющих возвращаемую метку, в *len.

CopLABEL_len_flags дополнительно возвращает UTF-8-ность возвращаемой метки, установив *flags в 0 или SVf_UTF8.

const char *  CopLABEL          (COP *const cop)
const char *  CopLABEL_len      (COP *const cop, STRLEN *len)
const char *  CopLABEL_len_flags(COP *const cop, STRLEN *len,
                                 U32 *flags)
CopLINE

Возвращает номер строки в исходном коде, связанный с COP c

STRLEN  CopLINE(const COP * c)
CopSTASH

Возвращает stash, связанный с c.

HV *  CopSTASH(const COP * c)
CopSTASH_eq

Возвращает булево значение, указывающее, является ли hv stash, связанным с c.

bool  CopSTASH_eq(const COP * c, const HV * hv)
CopSTASHPV

Возвращает имя пакета stash, связанного с c, или NULL, если связанного stash нет.

char *  CopSTASHPV(const COP * c)
CopSTASHPV_set

Устанавливает имя пакета stash, связанного с c, в строку C с нулевым завершением p, создавая пакет при необходимости.

void  CopSTASHPV_set(COP * c, const char * pv)
CopSTASH_set

Устанавливает stash, связанный с c, в hv.

bool  CopSTASH_set(COP * c, HV * hv)
cop_store_label

ПРИМЕЧАНИЕ: cop_store_label является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Сохраняет метку в cop_hints_hash. Для метки UTF-8 необходимо установить флаги в SVf_UTF8. Любые другие флаги игнорируются.

void  cop_store_label(COP *const cop, const char *label,
                      STRLEN len, U32 flags)
PERL_SI

Используйте этот typedef для объявления переменных, предназначенных для хранения struct stackinfo.

PL_curcop

Активный COP (оператор управления), примерно представляющий текущее утверждение в исходном коде.

В потоковых Perl'ях каждый поток имеет независимую копию этой переменной; каждый инициализируется во время создания текущим значением копии переменной создающего потока.

COP*  PL_curcop

Операторы пользовательского определения

custom_op_desc

DEPRECATED! Планируется удалить custom_op_desc в будущей версии Perl. Не используйте его в новом коде; удалите его из существующего кода.

Возвращает описание заданного оператора пользовательского определения. Раньше он использовался макросом OP_DESC, но больше не используется: он сохраняется только для совместимости и не должен использоваться.

const char *  custom_op_desc(const OP *o)
custom_op_name

DEPRECATED! Планируется удалить custom_op_name в будущей версии Perl. Не используйте его в новом коде; удалите его из существующего кода.

Возвращает имя заданного оператора пользовательского определения. Раньше он использовался макросом OP_NAME, но больше не используется: он сохраняется только для совместимости и не должен использоваться.

const char *  custom_op_name(const OP *o)
custom_op_register

Регистрирует оператор пользовательского определения. См. "Операторы пользовательского определения" в perlguts.

ПРИМЕЧАНИЕ: custom_op_register необходимо явно вызвать как Perl_custom_op_register с параметром aTHX_.

void  Perl_custom_op_register(pTHX_ Perl_ppaddr_t ppaddr,
                              const XOP *xop)
Perl_custom_op_xop

Возвращает структуру XOP для заданного оператора пользовательского определения. Этот макрос следует рассматривать как внутренний для OP_NAME и других макросов доступа: используйте их вместо него. Этот макрос вызывает функцию. До версии 5.19.6 это была функция.

const XOP *  Perl_custom_op_xop(pTHX_ const OP *o)
XopDISABLE

Временно отключает член XOP, очистив соответствующий флаг.

void  XopDISABLE(XOP *xop, which)
XopENABLE

Восстанавливает член XOP, который был отключён.

void  XopENABLE(XOP *xop, which)
XopENTRY

Возвращает член структуры XOP. which — это cpp-токен, указывающий, какой элемент вернуть. Если элемент не установлен, возвращается значение по умолчанию. Тип возвращаемого значения зависит от which. Этот макрос вычисляет свои аргументы более чем один раз. Если вы используете Perl_custom_op_xop для извлечения XOP * из OP *, используйте более эффективный "XopENTRYCUSTOM" вместо него.

XopENTRY(XOP *xop, which)
XopENTRYCUSTOM

Точно так же, как XopENTRY(XopENTRY(Perl_custom_op_xop(aTHX_ o), which), но более эффективно. Параметр which идентичен "XopENTRY".

XopENTRYCUSTOM(const OP *o, which)
END_OF_DOCUMENT_MARKER
XopENTRY_set

Установить член структуры XOP. which — это маркер языка C++, указывающий, какой элемент нужно установить. Подробности об доступных членах и их использовании см. в разделе "Пользовательские операторы" в perlguts. Данный макрос вычисляет свой аргумент более одного раза.

void  XopENTRY_set(XOP *xop, which, value)
XopFLAGS

Возвращает флаги XOP.

U32  XopFLAGS(XOP *xop)

Обработка CV

В этом разделе описываются функции для работы с CV, которые представляют собой значения кода, то есть подпрограммы. Для получения дополнительной информации см. perlguts.

caller_cx

Аналог функции caller() для XSUB-писателя. Возвращаемая PERL_CONTEXT структура содержит всю информацию, возвращаемую в Perl вызывающей caller. Обратите внимание, что XSUB не имеют кадровой структуры стека, поэтому caller_cx(0, NULL) вернёт информацию об окружающей Perl-коде.

Функция пропускает автоматические вызовы &DB::sub, осуществляемые от имени отладчика. Если запрашиваемый кадр стека был вызван DB::sub, то значением будет кадр для вызова DB::sub, так как он содержит правильный номер строки/др. информацию для места вызова. Если dbcxp не NULL, он будет установлен в указатель на сам кадр вызова подпрограммы.

const PERL_CONTEXT *  caller_cx(I32 level,
                                const PERL_CONTEXT **dbcxp)
CvDEPTH

Возвращает уровень рекурсии CV sv. Значение >= 2 указывает на рекурсивный вызов.

I32 *  CvDEPTH(const CV * const sv)
CvGV

Возвращает GV, связанный с CV sv, реифицируя его при необходимости.

GV *  CvGV(CV *sv)
CvSTASH

Возвращает хранилище CV. Хранилище — это хеш-таблица таблицы символов, содержащая переменные пакета, в котором была определена подпрограмма. Для получения дополнительной информации см. perlguts.

Это также имеет специальное применение для XS AUTOLOAD-подпрограмм. См. "Автозагрузка с XSUB" в perlguts.

HV*  CvSTASH(CV* cv)
find_runcv

Находит CV, соответствующий текущей выполняемой подпрограмме или eval. Если db_seqp не null, пропускаются CV, находящиеся в пакете DB, и *db_seqp заполняется номером последовательности обработки в момент входа кода DB::. (Это позволяет отладчикам выполнять eval в области точки останова, а не в области самого отладчика.)

CV*  find_runcv(U32 *db_seqp)
get_cv
get_cvs
get_cvn_flags

Эти функции возвращают CV указанной Perl-подпрограммы. flags передаются в gv_fetchpvn_flags. Если GV_ADD установлено и Perl-подпрограмма не существует, она будет объявлена (что эквивалентно sub name;). Если GV_ADD не установлено и подпрограмма не существует, возвращается NULL.

Форматы отличаются только тем, как указывается имя подпрограммы. С get_cvs, имя — это буквальная строка C, заключенная в двойные кавычки. С get_cv, имя задаётся параметром name, который должен быть завершающейся нулём строкой C. С get_cvn_flags, имя также задаётся параметром name, но это строка Perl (возможно, содержащая вставленные нули), а её длина в байтах содержится в параметре len.

ПРИМЕЧАНИЕ: форма perl_get_cv() устарела.

ПРИМЕЧАНИЕ: форма perl_get_cvs() устарела.

ПРИМЕЧАНИЕ: форма perl_get_cvn_flags() устарела.

CV*   get_cv       (const char* name, I32 flags)
CV *  get_cvs      ("string", I32 flags)
CV*   get_cvn_flags(const char* name, STRLEN len, I32 flags)
Nullcv

DEPRECATED! Планируется удалить Nullcv из будущих релизов Perl. Не используйте его в новом коде; удалите из существующего кода.

Указатель на нулевой CV.

(устарело — используйте (CV *)NULL вместо этого)

SvAMAGIC_off

Указывает, что у sv отключена перегрузка (активная магия).

void  SvAMAGIC_off(SV *sv)
SvAMAGIC_on

Указывает, что у sv включена перегрузка (активная магия).

void  SvAMAGIC_on(SV *sv)

Отладка

deb
deb_nocontext

Когда Perl скомпилирован с -DDEBUGGING, это выводит в STDERR информацию, заданную аргументами, с префиксом имени файла, содержащего скрипт, вызвавший вызов, и номером строки в этом файле.

Если в действии опция отладки v (подробная), также выводится идентификатор процесса.

Различие между двумя формами состоит лишь в том, что deb_nocontext не принимает параметр контекста потока (aTHX), поэтому используется в ситуациях, когда у вызывающего уже есть контекст потока.

ПРИМЕЧАНИЕ: deb должен быть явно вызван как Perl_deb с параметром aTHX_.

void  Perl_deb     (pTHX_ const char* pat, ...)
void  deb_nocontext(const char* pat, ...)
debstack

Выводит текущий стек

I32  debstack()
dump_all

Выводит весь оп-дерево текущей программы, начиная с PL_main_root до STDERR. Также выводит оп-деревья всех видимых подпрограмм в PL_defstash.

void  dump_all()
dump_c_backtrace

Выводит C-стек вызовов в заданный fp.

Возвращает true, если стек вызовов был получен, и false в противном случае.

bool  dump_c_backtrace(PerlIO* fp, int max_depth, int skip)
dump_eval

Описание в perlguts.

void  dump_eval()
dump_form

Выводит содержимое формата, содержащегося в GV gv в STDERR, или сообщение, что такого формата нет.

void  dump_form(const GV* gv)
dump_packsubs

Выводит оп-деревья всех видимых подпрограмм в stash.

void  dump_packsubs(const HV* stash)
dump_sub

Описание в perlguts.

void  dump_sub(const GV* gv)
get_c_backtrace_dump

Возвращает SV, содержащий вывод depth кадров стека вызовов, пропуская skip самых внутренних. depth из 20 обычно достаточно.

Выводимый вывод выглядит так:

...
1   10e004812:0082   Perl_croak   util.c:1716    /usr/bin/perl
2   10df8d6d2:1d72   perl_parse   perl.c:3975    /usr/bin/perl
...

Поля разделены табуляцией. Первый столбец — глубина (ноль — самый внутренний кадр, не пропущенный). В hex:offset шестнадцатеричное значение — это адрес программы в S_parse_body, а :offset (может отсутствовать) указывает, насколько глубоко в S_parse_body находился адрес программы.

util.c:1716 — это файл исходного кода и номер строки.

/usr/bin/perl — очевидно (надеюсь).

Неизвестные — "-". Неизвестные, к сожалению, могут возникнуть довольно легко: если платформа не поддерживает получение информации; если в бинарнике отсутствуют отладочные данные; если оптимизатор изменил код, например, путем встраивания.

SV*  get_c_backtrace_dump(int max_depth, int skip)
gv_dump

Выводит имя и, если они отличаются, эффективное имя GV gv в STDERR.

void  gv_dump(GV* gv)
HAS_BACKTRACE

Этот символ, если определён, указывает, что функция backtrace() доступна для получения стека вызовов. Для использования этой функции необходимо включить заголовок execinfo.h.

magic_dump

Выводит содержимое MAGIC mg в STDERR.

void  magic_dump(const MAGIC *mg)
op_class

Определяет тип структуры, к которому относится операнд. Возвращает один из перечислений OPclass, таких как OPclass_LISTOP.

OPclass  op_class(const OP *o)
op_dump

Выводит оп-дерево, начиная с OP o в STDERR.

void  op_dump(const OP *o)
PL_op

Описание в perlhacktips.

PL_runops

Описание в perlguts.

PL_sv_serial

Описание в perlhacktips.

pmop_dump

Выводит OP, связанный с сопоставлением шаблонов, например, s/foo/bar/; они требуют специальной обработки.

void  pmop_dump(PMOP* pm)
sv_dump

Выводит содержимое SV в файловый дескриптор STDERR.

Пример вывода см. в Devel::Peek.

void  sv_dump(SV* sv)
vdeb

Это аналогично "deb", но args — это инкапсулированный список аргументов.

void  vdeb(const char* pat, va_list* args)

Функции отображения

form
form_nocontext

Принимают шаблон форматирования в стиле sprintf и стандартные (не SV) аргументы и возвращают отформатированную строку.

(char *) Perl_form(pTHX_ const char* pat, ...)

могут использоваться в любом месте, где требуется строка (char *):

char * s = Perl_form("%d.%d",major,minor);

Используют единственный частный буфер (на поток), поэтому если нужно отформатировать несколько строк, необходимо явно скопировать предыдущие строки (и освободить копии, когда закончите).

Различие между двумя формами состоит лишь в том, что form_nocontext не принимает параметр контекста потока (aTHX), поэтому используется в ситуациях, когда у вызывающего уже есть контекст потока.

ПРИМЕЧАНИЕ: form должен быть явно вызван как Perl_form с параметром aTHX_.

char*  Perl_form     (pTHX_ const char* pat, ...)
char*  form_nocontext(const char* pat, ...)
mess
mess_nocontext

Принимают шаблон форматирования в стиле sprintf и список аргументов, используемых для создания строки сообщения. Если сообщение не заканчивается новой строкой, оно дополняется некоторым указанием текущего местоположения в коде, как описано для "mess_sv".

Обычно возвращаемое сообщение находится в новом временном SV. Однако при глобальном уничтожении один SV может быть общим для нескольких вызовов этой функции.

Различие между двумя формами состоит лишь в том, что mess_nocontext не принимает параметр контекста потока (aTHX), поэтому используется в ситуациях, когда у вызывающего уже есть контекст потока.

ПРИМЕЧАНИЕ: mess должен быть явно вызван как Perl_mess с параметром aTHX_.

SV*  Perl_mess     (pTHX_ const char* pat, ...)
SV*  mess_nocontext(const char* pat, ...)
mess_sv

Расширяет сообщение, предназначенное для пользователя, чтобы включить указание текущего местоположения в коде, если сообщение, по-видимому, еще не завершено.

basemsg — это исходное сообщение или объект. Если это ссылка, она будет использована как есть и станет результатом этой функции. В противном случае она используется как строка, и если она уже заканчивается новой строкой, считается завершенной, и результат этой функции будет той же строкой. Если сообщение не заканчивается новой строкой, тогда добавляется фрагмент, например, at foo.pl line 37, и, возможно, другие фразы, указывающие текущее состояние выполнения. Результирующее сообщение будет заканчиваться точкой и новой строкой.

Обычно результирующее сообщение возвращается в новом временном SV. Во время глобального уничтожения один SV может использоваться повторно в разных вызовах этой функции. Если consume истинно, то функция может (но не обязана) изменить и вернуть basemsg вместо выделения нового SV.

SV*  mess_sv(SV* basemsg, bool consume)
pv_display

Аналогично

pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);

за исключением того, что к строке будет добавлен дополнительный "\0", когда len > cur и pv[cur] — "\0".

Обратите внимание, что итоговая строка может быть на 7 символов длиннее, чем pvlim.

char*  pv_display(SV *dsv, const char *pv, STRLEN cur, STRLEN len,
                  STRLEN pvlim)
pv_escape

Экранирует не более первых count символов pv и помещает результаты в dsv, так что размер экранированной строки не превысит max символов и не будет содержать неполных последовательностей экранирования. Количество экранированных байтов будет возвращено в параметре STRLEN *escaped, если он не равен null. Когда параметр dsv равен null, экранирование фактически не выполняется, но будет вычислено количество байтов, которые бы были экранированы, если бы он не был null.

Если flags содержит PERL_PV_ESCAPE_QUOTE, то любые двойные кавычки в строке также будут экранированы.

Обычно SV очищается перед подготовкой экранированной строки, но когда PERL_PV_ESCAPE_NOCLEAR установлено, это не произойдёт.

Если PERL_PV_ESCAPE_UNI установлено, то входная строка обрабатывается как UTF-8. Если PERL_PV_ESCAPE_UNI_DETECT установлено, то входная строка сканируется с помощью is_utf8_string(), чтобы определить, является ли она UTF-8.

Если PERL_PV_ESCAPE_ALL установлено, все символы ввода будут выводиться с помощью экранирования в стиле \x01F1, иначе, если PERL_PV_ESCAPE_NONASCII установлено, только символы, не являющиеся ASCII, будут экранированы в этом стиле; в противном случае только символы выше 255 будут экранированы таким образом; другие непечатаемые символы будут использовать восьмеричное представление или общие шаблоны экранирования, такие как \n. В противном случае, если PERL_PV_ESCAPE_NOBACKSLASH, все символы ниже 255 будут считаться печатными и будут выведены как литералы.

Если PERL_PV_ESCAPE_FIRSTCHAR установлено, будет экранирован только первый символ строки, независимо от max. Если вывод должен быть в шестнадцатеричном формате, он будет возвращен как обычная шестнадцатеричная последовательность. Таким образом, вывод будет либо одиночным символом, либо восьмеричной последовательностью экранирования, либо специальной последовательностью экранирования, такой как \n, или шестнадцатеричным значением.

Если PERL_PV_ESCAPE_RE установлено, символ экранирования будет "%", а не "\\". Это связано с тем, что в регулярных выражениях часто встречаются последовательности с обратной косой чертой, тогда как "%" — не очень распространённый символ в шаблонах.

Возвращает указатель на экранированный текст, хранящийся в dsv.

char*  pv_escape(SV *dsv, char const * const str,
                 const STRLEN count, const STRLEN max,
                 STRLEN * const escaped, const U32 flags)
pv_pretty

Преобразует строку в что-то удобочитаемое, обрабатывая экранирование через pv_escape() и поддерживая кавычки и многоточие.

Если установлен флаг PERL_PV_PRETTY_QUOTE, результат будет заключён в двойные кавычки, а любые двойные кавычки в строке будут экранированы. В противном случае, если установлен флаг PERL_PV_PRETTY_LTGT, результат будет заключён в угловые скобки.

Если установлен флаг PERL_PV_PRETTY_ELLIPSES и не все символы в строке были выведены, то к строке добавляется многоточие .... Обратите внимание, что это происходит ПОСЛЕ того, как она была обрамлена кавычками.

Если start_color не равно null, оно будет вставлено после открывающей кавычки (если она есть), но перед экранированным текстом. Если end_color не равно null, оно будет вставлено после экранированного текста, но перед кавычками или многоточием.

Возвращает указатель на отформатированный текст, хранящийся в dsv.

char*  pv_pretty(SV *dsv, char const * const str,
                 const STRLEN count, const STRLEN max,
                 char const * const start_color,
                 char const * const end_color, const U32 flags)
vform

Подобно "form", но аргументы представляют собой список аргументов в капсуле.

char*  vform(const char* pat, va_list* args)
vmess

pat и args — это шаблон форматирования в стиле sprintf и список аргументов в капсуле соответственно. Они используются для генерации строчного сообщения. Если сообщение не заканчивается новой строкой, то оно будет расширено некоторым указанием текущего местоположения в коде, как описано для "mess_sv".

Обычно результирующее сообщение возвращается в новом временном SV. Во время глобального уничтожения один SV может использоваться повторно в разных вызовах этой функции.

SV*  vmess(const char* pat, va_list* args)

Встраивание, потоки и клонирование интерпретатора

call_atexit

Добавляет функцию fn в список функций, которые должны быть вызваны при глобальном уничтожении. ptr будет передано как аргумент функции fn; оно может указывать на struct, так что вы можете передать всё, что захотите.

Обратите внимание, что в условиях многопоточности fn может выполняться несколько раз. Это происходит потому, что список выполняется каждый раз, когда завершается текущий или любой дочерний поток.

void  call_atexit(ATEXIT_t fn, void *ptr)
cv_clone

Клонирует CV, создавая лексическое замыкание. proto предоставляет шаблон функции: её код, структуру стека и другие атрибуты. Шаблон объединяется со сбором внешних лексических переменных, на которые ссылается код, которые берутся из текущего выполняющегося экземпляра непосредственно окружающего кода.

CV*  cv_clone(CV* proto)
cv_name

Возвращает SV, содержащий имя CV, в основном для использования при сообщении об ошибках. CV фактически может быть GV, в этом случае возвращаемый SV содержит имя GV. Любое значение, отличное от GV или CV, обрабатывается как строка, уже содержащая имя подпрограммы, но это может измениться в будущем.

В качестве второго аргумента может быть передан SV. В этом случае имя будет назначено ему, и оно будет возвращено. В противном случае возвращаемый SV будет новым временным.

Если flags имеет установленный бит CV_NAME_NOTQUAL, то имя пакета не будет включено. Если первый аргумент не является ни CV, ни GV, этот флаг игнорируется (предполагается изменение).

SV *  cv_name(CV *cv, SV *sv, U32 flags)
cv_undef

Очищает все активные компоненты CV. Это может произойти либо при явном undef &foo, либо при уменьшении счётчика ссылок до нуля. В первом случае мы сохраняем указатель CvOUTSIDE, чтобы любые анонимные дочерние элементы могли следовать всей цепочке лексического пространства.

void  cv_undef(CV* cv)
find_rundefsv

Возвращает глобальную переменную $_.

SV*  find_rundefsv()
find_rundefsvoffset

DEPRECATED! Планируется удалить find_rundefsvoffset из будущих релизов Perl. Не используйте его для нового кода; удалите его из существующего кода.

До удаления лексического $_ этот функция находила позицию лексической $_ в стеке текущей функции и возвращала смещение в текущем стеке или NOT_IN_PAD.

Теперь она всегда возвращает NOT_IN_PAD.

PADOFFSET  find_rundefsvoffset()
HAS_SKIP_LOCALE_INIT

Описано в perlembed.

intro_my

"Вводят" my переменные в видимый статус. Это происходит во время разбора в конце каждой инструкции, чтобы сделать лексические переменные видимыми для последующих инструкций.

U32  intro_my()
load_module
load_module_nocontext

Эти функции загружают модуль, имя которого указано в строке части name. Обратите внимание, что должно быть указано фактическое имя модуля, а не его имя файла. Например, "Foo::Bar" вместо "Foo/Bar.pm". Если указан ver и он не равен null, то он обеспечивает семантику версии, аналогичную use Foo::Bar VERSION. Дополнительные аргументы могут быть использованы для задания аргументов к методу import() модуля, аналогично use Foo::Bar VERSION LIST; их точная обработка зависит от флагов. Аргумент flags представляет собой битовое ИЛИ из любого из PERL_LOADMOD_DENY, PERL_LOADMOD_NOIMPORT или PERL_LOADMOD_IMPORT_OPS (или 0 для отсутствия флагов).

Если PERL_LOADMOD_NOIMPORT установлен, модуль загружается так, как если бы он имел пустой список импорта, как в use Foo::Bar (); это единственный случай, когда необязательные дополнительные аргументы могут быть опущены полностью. В противном случае, если PERL_LOADMOD_IMPORT_OPS установлен, дополнительные аргументы должны состоять ровно из одного OP*, содержащего дерево операций, генерирующее соответствующие аргументы импорта. В противном случае, дополнительные аргументы должны быть значениями SV*, которые будут использованы в качестве аргументов импорта; и список должен быть завершён (SV*) NULL. Если ни PERL_LOADMOD_NOIMPORT, ни PERL_LOADMOD_IMPORT_OPS не установлены, указатель NULL на дополнительные аргументы необходим даже если аргументы импорта не требуются. Счётчик ссылок для каждого указанного SV* аргумента уменьшается. Кроме того, аргумент name изменяется.

Если PERL_LOADMOD_DENY установлен, модуль загружается как если бы с no, а не с use.

load_module и load_module_nocontext имеют одинаковую на первый взгляд сигнатуру, но первый скрывает тот факт, что он обращается к параметру контекста потока. Поэтому используйте последний, когда у вас возникает ошибка компиляции о pTHX.

void  load_module          (U32 flags, SV* name, SV* ver, ...)
void  load_module_nocontext(U32 flags, SV* name, SV* ver, ...)
my_exit

Обёртка для библиотечной функции C exit(3), учитывающая то, что сказано в "PL_exit_flags" в perlapi.

void  my_exit(U32 status)
newPADNAMELIST

ПРИМЕЧАНИЕ: newPADNAMELIST — экспериментальная функция и может быть изменена или удалена без предварительного уведомления.

Создаёт новый список имён стеков. max — это максимальный индекс, для которого выделяется память.

PADNAMELIST *  newPADNAMELIST(size_t max)
newPADNAMEouter

ПРИМЕЧАНИЕ: newPADNAMEouter — экспериментальная функция и может быть изменена или удалена без предварительного уведомления.

Создаёт и возвращает новое имя стека. Используйте эту функцию только для имён, которые ссылаются на внешние лексические переменные. (См. также "newPADNAMEpvn".) outer — это внешнее имя стека, которое это отражает. Возвращаемое имя стека уже имеет установленный флаг PADNAMEt_OUTER.

PADNAME *  newPADNAMEouter(PADNAME *outer)
newPADNAMEpvn

ПРИМЕЧАНИЕ: newPADNAMEpvn является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Создаёт и возвращает новое имя блока. s должно быть строкой UTF-8. Не используйте это для имён блоков, которые указывают на внешние лексические переменные. Смотрите "newPADNAMEouter".

PADNAME *  newPADNAMEpvn(const char *s, STRLEN len)
nothreadhook

Заглушка, предоставляющая обработку потоков для perl_destruct, когда нет потоков.

int  nothreadhook()
pad_add_anon

Выделяет место в текущем компилируемом блоке (через "pad_alloc") для анонимной функции, лексически вложенной в текущую компилируемую функцию. Функция func связана с блоком, и её CvOUTSIDE связь с внешней областью видимости ослаблена для избежания цикла ссылок.

Один счётчик ссылок крадёт, поэтому вам может потребоваться SvREFCNT_inc(func).

optype должен быть кодом операции, который блок должен поддерживать. Это не влияет на операционные семантики, но используется для отладки.

PADOFFSET  pad_add_anon(CV* func, I32 optype)
pad_add_name_pv

Точно так же, как "pad_add_name_pvn", но принимает строку с завершающим нулём вместо пары строка/длина.

PADOFFSET  pad_add_name_pv(const char *name, const U32 flags,
                           HV *typestash, HV *ourstash)
pad_add_name_pvn

Выделяет место в текущем компилируемом блоке для именованной лексической переменной. Хранит имя и другие метаданные в части имени блока и подготавливает управление лексической областью видимости переменной. Возвращает смещение выделенного слота блока.

namepv/namelen указывают имя переменной, включая ведущий символ. Если typestash не равно нулю, имя предназначено для типизированной лексической переменной, и это идентифицирует тип. Если ourstash не равно нулю, это лексическая ссылка на переменную пакета, и это идентифицирует пакет. Следующие флаги можно объединять по оператору OR:

padadd_OUR          redundantly specifies if it's a package var
padadd_STATE        variable will retain value persistently
padadd_NO_DUP_CHECK skip check for lexical shadowing
PADOFFSET  pad_add_name_pvn(const char *namepv, STRLEN namelen,
                            U32 flags, HV *typestash,
                            HV *ourstash)
pad_add_name_sv

Точно так же, как "pad_add_name_pvn", но принимает строку имени в виде SV вместо пары строка/длина.

PADOFFSET  pad_add_name_sv(SV *name, U32 flags, HV *typestash,
                           HV *ourstash)
pad_alloc

ПРИМЕЧАНИЕ: pad_alloc является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Выделяет место в текущем компилируемом блоке, возвращая смещение выделенного слота блока. Изначально имя не прикреплено к слоту блока. tmptype — набор флагов, указывающих на тип требуемого блока, который будет установлен в значении SV для выделенного слота блока:

SVs_PADMY    named lexical variable ("my", "our", "state")
SVs_PADTMP   unnamed temporary store
SVf_READONLY constant shared between recursion levels

SVf_READONLY поддерживается здесь только с perl 5.20. Чтобы работать с более ранними версиями, используйте SVf_READONLY|SVs_PADTMP. SVf_READONLY не делает SV в слоте блока только для чтения, а просто сообщает pad_alloc, что он будет сделан только для чтения (вызывающим элементом) или, по крайней мере, должен рассматриваться как таковой.

optype должен быть кодом операции, указывающим тип операции, которую должен поддерживать блок. Это не влияет на операционные семантики, но используется для отладки.

PADOFFSET  pad_alloc(I32 optype, U32 tmptype)
pad_findmy_pv

Точно так же, как "pad_findmy_pvn", но принимает строку с завершающим нулём вместо пары строка/длина.

PADOFFSET  pad_findmy_pv(const char* name, U32 flags)
pad_findmy_pvn

Учитывая имя лексической переменной, найдите её позицию в текущем компилируемом блоке. namepv/namelen указывают имя переменной, включая ведущий символ. flags зарезервировано и должно быть равно нулю. Если она не находится в текущем блоке, но встречается в блоке любого лексически вложенного области видимости, то в текущем блоке добавляется псевдозапись. Возвращает смещение в текущем блоке или NOT_IN_PAD если такая лексическая переменная не в области видимости.

PADOFFSET  pad_findmy_pvn(const char* namepv, STRLEN namelen,
                          U32 flags)
pad_findmy_sv

Точно так же, как "pad_findmy_pvn", но принимает строку имени в виде SV вместо пары строка/длина.

PADOFFSET  pad_findmy_sv(SV* name, U32 flags)
padnamelist_fetch

ПРИМЕЧАНИЕ: padnamelist_fetch является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Извлекает имя блока по заданному индексу.

PADNAME *  padnamelist_fetch(PADNAMELIST *pnl, SSize_t key)
padnamelist_store

ПРИМЕЧАНИЕ: padnamelist_store является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Сохраняет имя блока (которое может быть нулевым) в заданном индексе, освобождая любое существующее имя блока в этом слоте.

PADNAME **  padnamelist_store(PADNAMELIST *pnl, SSize_t key,
                              PADNAME *val)
pad_tidy

ПРИМЕЧАНИЕ: pad_tidy является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Приводит в порядок блок в конце компиляции кода, к которому он принадлежит. Выполняемые здесь задачи: удаление большей части содержимого из блоков анонимных подпрограмм; присвоение ему @_; помечает временные переменные как временные. type указывает тип подпрограммы:

padtidy_SUB        ordinary subroutine
padtidy_SUBCLONE   prototype for lexical closure
padtidy_FORMAT     format
void  pad_tidy(padtidy_type type)
perl_alloc

Выделяет новый интерпретатор Perl. Смотрите perlembed.

PerlInterpreter*  perl_alloc()
PERL_ASYNC_CHECK

Описано в perlinterp.

void  PERL_ASYNC_CHECK()
perl_construct

Инициализирует новый интерпретатор Perl. Смотрите perlembed.

void  perl_construct(PerlInterpreter *my_perl)
perl_destruct

Закрывает интерпретатор Perl. Смотрите perlembed для руководства.

my_perl указывает на интерпретатор Perl. Он должен был быть создан ранее с помощью "perl_alloc" и "perl_construct". Он мог быть инициализирован с помощью "perl_parse" и мог использоваться через "perl_run" и другими способами. Эту функцию следует вызывать для любого интерпретатора Perl, который был создан с помощью "perl_construct", даже если последующие операции с ним завершились неудачей, например, если "perl_parse" вернула ненулевое значение.

Если слово интерпретатора PL_exit_flags имеет установленный флаг PERL_EXIT_DESTRUCT_END, то эта функция выполнит код в блоках END перед выполнением остальной части уничтожения. Если требуется использовать интерпретатор между "perl_parse" и "perl_destruct" иначе, чем просто вызов "perl_run", то этот флаг должен быть установлен на ранней стадии. Это важно, если "perl_run" не будет вызван или если будет выполнено что-то еще помимо вызова "perl_run".

Возвращает значение, подходящее для передачи в функцию C-библиотеки exit (или для возврата из main), чтобы служить кодом завершения, указывающим на характер завершения работы интерпретатора. Это учитывает любую неудачу "perl_parse" и любое преждевременное завершение из "perl_run". Код завершения имеет тип, требуемый операционной системой хоста, поэтому из-за различных соглашений о кодах завершения он не переносится для интерпретации конкретных числовых значений как имеющих конкретные значения.

int  perl_destruct(PerlInterpreter *my_perl)
perl_free

Освобождает интерпретатор Perl. Смотрите perlembed.

void  perl_free(PerlInterpreter *my_perl)
PERL_GET_CONTEXT

Описано в perlguts.

PerlInterpreter

Описано в perlembed.

END_OF_DOCUMENT_MARKER
perl_parse

Сообщает интерпретатору Perl о необходимости парсить скрипт Perl. Это выполняет большую часть начальной инициализации интерпретатора Perl. См. perlembed для обучающего материала.

my_perl указывает на интерпретатор Perl, который должен парсить скрипт. Он должен быть предварительно создан с помощью "perl_alloc" и "perl_construct". xsinit указывает на функцию обратного вызова, которая будет вызвана для настройки возможности загрузки расширений XS этим интерпретатором Perl, или может быть равна null для отказа от такой настройки.

argc и argv предоставляют набор аргументов командной строки интерпретатору Perl, как обычно передаются в функцию main программы на C. argv[argc] должно быть null. Эти аргументы указывают на скрипт для парсинга, либо путем указания имени файла скрипта, либо путем предоставления скрипта в -e параметре. Если $0 будет записываться в интерпретатор Perl, то строки аргументов должны находиться в памяти, доступной для записи, и поэтому не должны быть просто строковыми константами.

env определяет набор переменных среды, которые будут использоваться этим интерпретатором Perl. Если не равно null, оно должно указывать на нуль-терминированный массив строк среды. Если равно null, интерпретатор Perl будет использовать среду, предоставленную глобальной переменной environ.

Эта функция инициализирует интерпретатор, парсит и компилирует скрипт, указанный аргументами командной строки. Это включает выполнение кода в BEGIN, UNITCHECK, и CHECK блоках. Он не выполняет INIT блоки или основную программу.

Возвращает целое число с несколько запутанной интерпретацией. Правильное использование возвращаемого значения – как булево значение, указывающее на наличие ошибки при инициализации. Если возвращено ноль, это указывает на успешную инициализацию, и безопасно вызывать "perl_run" и использовать его дальше. Если возвращено ненулевое значение, это указывает на какую-то проблему, означающую, что интерпретатор хочет завершиться. Интерпретатор не должен просто быть брошен при такой ошибке; вызывающая сторона должна произвести чистую остановку интерпретатора с помощью "perl_destruct" и освободить его с помощью "perl_free".

По историческим причинам, ненулевое возвращаемое значение также пытается быть подходящим значением для передачи в функцию библиотеки C exit (или для возврата из main), чтобы служить в качестве кода завершения, указывающего на характер завершения инициализации. Однако это не переносимо из-за различных соглашений о кодах завершения. Сохраняется историческая ошибка: если встроенная функция Perl exit вызывается во время выполнения этой функции с типом выхода, подразумевающим нулевой код выхода в соответствии с соглашениями операционной системы хоста, то эта функция возвращает ноль вместо ненулевого значения. Эта ошибка [perl #2754] приводит к вызову perl_run (и, следовательно, к выполнению INIT блоков и основной программы) несмотря на вызов exit. Она сохранена, потому что популярный модуль-установщик полагается на неё и требует времени на исправление. Эта проблема [perl #132577], а исходная ошибка должна быть исправлена в Perl 5.30.

int  perl_parse(PerlInterpreter *my_perl, XSINIT_t xsinit,
                int argc, char** argv, char** env)
perl_run

Сообщает интерпретатору Perl о необходимости выполнить его основную программу. См. perlembed для обучающего материала.

my_perl указывает на интерпретатор Perl. Он должен быть предварительно создан с помощью "perl_alloc" и "perl_construct" и инициализирован с помощью "perl_parse". Эта функция не должна вызываться, если "perl_parse" вернула ненулевое значение, указывающее на ошибку инициализации или компиляции.

Эта функция выполняет код в INIT блоках, а затем выполняет основную программу. Код для выполнения устанавливается предыдущим вызовом "perl_parse". Если слово интерпретатора PL_exit_flags не имеет флага PERL_EXIT_DESTRUCT_END, то эта функция также выполнит код в END блоках. Если нужно сделать дальнейшее использование интерпретатора после вызова этой функции, то END блоки следует отложить до времени "perl_destruct", установив этот флаг.

Возвращает целое число с несколько запутанной интерпретацией. Правильное использование возвращаемого значения – как булево значение, указывающее на то, завершилась ли программа вне локальной области. Если возвращено ноль, это указывает на завершение программы до конца, и безопасно использовать интерпретатор дальше (при условии, что флаг PERL_EXIT_DESTRUCT_END был установлен, как описано выше). Если возвращено ненулевое значение, это указывает, что интерпретатор хочет прервать выполнение. Интерпретатор не должен просто быть брошен из-за этого желания завершения; вызывающая сторона должна произвести чистую остановку интерпретатора с помощью "perl_destruct" и освободить его с помощью "perl_free".

По историческим причинам, ненулевое возвращаемое значение также пытается быть подходящим значением для передачи в функцию библиотеки C exit (или для возврата из main), чтобы служить в качестве кода завершения, указывающего на характер завершения программы. Однако это не переносимо из-за различных соглашений о кодах завершения. Производится попытка вернуть код завершения типа, требуемого операционной системой хоста, но поскольку он ограничен ненулевым значением, не всегда возможно указать все типы завершения. Это надежно только на Unix, где нулевой код завершения может быть дополнен установленным битом, который будет проигнорирован. В любом случае, эта функция не является правильным местом для получения кода завершения: его следует получить из "perl_destruct".

int  perl_run(PerlInterpreter *my_perl)
PERL_SET_CONTEXT

Описание в perlguts.

void  PERL_SET_CONTEXT(PerlInterpreter* i)
PERL_SYS_INIT
PERL_SYS_INIT3

Эти функции обеспечивают настройку среды выполнения C, специфичную для системы, необходимую для запуска интерпретаторов Perl. Следует использовать только одну, и она должна вызываться только один раз, перед созданием любых интерпретаторов Perl.

Они отличаются тем, что PERL_SYS_INIT3 также инициализирует env.

void  PERL_SYS_INIT (int *argc, char*** argv)
void  PERL_SYS_INIT3(int *argc, char*** argv, char*** env)
PERL_SYS_TERM

Обеспечивает очистку среды выполнения C, специфичную для системы, после запуска интерпретаторов Perl. Это следует вызывать только один раз, после освобождения любых оставшихся интерпретаторов Perl.

void  PERL_SYS_TERM()
PL_exit_flags

Содержит флаги, контролирующие поведение perl при выходе:

  • PERL_EXIT_DESTRUCT_END

    Если установлен, блоки END выполняются при уничтожении интерпретатора. Это обычно устанавливается самим perl после создания интерпретатора.

  • PERL_EXIT_ABORT

    Вызывать abort() при выходе. Это используется внутри perl для прерывания, если exit вызывается во время обработки exit.

  • PERL_EXIT_WARN

    Выводить предупреждения при выходе.

  • PERL_EXIT_EXPECTED

    Устанавливается оператором "exit" в perlfunc.

U8  PL_exit_flags
PL_origalen

Описание в perlembed.

PL_perl_destruct_level

Это значение может быть установлено при внедрении для полной очистки.

Возможные значения:

  • 0 - нет

  • 1 - полная

  • 2 или больше - полная с проверками.

Если $ENV{PERL_DESTRUCT_LEVEL} установлено на целое число больше значения PL_perl_destruct_level, его значение используется вместо него.

В многопоточных Perl, каждый поток имеет независимую копию этой переменной; каждая инициализируется при создании значением копии переменной создающего потока.

signed char  PL_perl_destruct_level
require_pv

Заставляет Perl require файл, имя которого указано в строковом аргументе. Аналогично коду Perl eval "require '$file'". Он даже реализован таким образом; рекомендуется использовать load_module вместо этого.

ПРИМЕЧАНИЕ: форма perl_require_pv() устарела.

void  require_pv(const char* pv)
vload_module

Подобно "load_module", но аргументы представляют собой инкапсулированный список аргументов.

void  vload_module(U32 flags, SV* name, SV* ver, va_list* args)

Errno

sv_string_from_errnum

Генерирует строку сообщения, описывающую ошибку ОС, и возвращает её как SV. errnum должно быть значением, которое errno могло принять, идентифицируя тип ошибки.

Если tgtsv не равно null, то строка будет записана в этот SV (перезаписывая существующее содержимое), и он будет возвращён. Если tgtsv равно указателю null, то строка будет записана в новый смертный SV, который будет возвращён.

Сообщение будет взято из того языка, который использовался бы $!, и будет закодировано в SV так, как это делалось бы $!. Подробности этого процесса могут измениться в будущем. В настоящее время сообщение берётся из C-локалей по умолчанию (обычно генерируется английское сообщение), и из выбранной локали во время действия псевдонима use locale. Делается попытка декодировать сообщение из кодировки символов локали, но оно будет декодировано только как UTF-8 или ISO-8859-1. Оно всегда корректно декодируется в локали UTF-8, обычно в локали ISO-8859-1, и никогда в других локалях.

SV всегда возвращается, содержащий фактическую строку, и без других установленных битов OK. В отличие от $!, сообщение выдаётся даже для errnum нуля (что означает успех), и если полезное сообщение недоступно, возвращается бесполезная строка (в настоящее время пустая).

SV*  sv_string_from_errnum(int errnum, SV* tgtsv)

Обработка исключений (простые) макросы

dXCPT

Настраивает необходимые локальные переменные для обработки исключений. См. "Обработка исключений" в perlguts.

dXCPT;
JMPENV_JUMP

Описание в perlinterp.

void  JMPENV_JUMP(int v)
JMPENV_PUSH

Описание в perlinterp.

void  JMPENV_PUSH(int v)
PL_restartop

Описание в perlinterp.

XCPT_CATCH

Вводит блок catch. См. "Обработка исключений" в perlguts.

XCPT_RETHROW

Перебрасывает ранее перехваченное исключение. См. "Обработка исключений" в perlguts.

XCPT_RETHROW;
XCPT_TRY_END

Завершает блок try. См. "Обработка исключений" в perlguts.

XCPT_TRY_START

Начинает блок try. См. "Обработка исключений" в perlguts.

Значения конфигурации файловой системы

См. также "Список символов возможностей HAS_foo".

DIRNAMLEN

Если этот символ определен, программа на C понимает, что длина имен каталога предоставляется полем d_namlen. В противном случае необходимо выполнить strlen() с полем d_name.

DOSUID

Если этот символ определен, программа на C должна проверить сценарий, который она выполняет, на наличие битов setuid/setgid и попытаться эмулировать setuid/setgid на системах, где отключены сценарии #! setuid, потому что ядро не может сделать это безопасно. Разработчику пакета необходимо убедиться, что эта эмуляция выполняется безопасно. В частности, он должен выполнить fstat на только что открытом сценарии, чтобы убедиться, что это действительно сценарий setuid/setgid, убедиться, что переданные аргументы точно соответствуют аргументам в строке #!, и не доверять никаким дочерним процессам, которым необходимо передать имя файла, а не дескриптор файла исполняемого сценария.

EOF_NONBLOCK

Если этот символ определен, программа на C понимает, что read() на дескрипторе файла без блокировки вернёт 0 при EOF, а не значение, хранящееся в RD_NODATA (-1 обычно, в таком случае!).

FCNTL_CAN_LOCK

Если этот символ определен, то fcntl() можно использовать для блокировки файлов. Обычно на системах Unix он определен. Он может быть не определён на VMS.

FFLUSH_ALL

Если этот символ определен, для сброса всех ожидающих выводов stdio необходимо перебрать все дескрипторы файлов stdio, хранящиеся в массиве, и сбросить их с помощью fflush. Обратите внимание, что если fflushNULL определен, fflushall даже не будет проверен и останется неопределённым.

FFLUSH_NULL

Если этот символ определен, fflush(NULL) правильно сбрасывает все ожидающие выводы stdio без побочных эффектов. В частности, на некоторых платформах вызов fflush(NULL) *все ещё* повреждает STDIN, если это пайп.

FILE_base

Эта макрокоманда используется для доступа к полю _base (или эквиваленту) структуры FILE, на которую указывает её аргумент. Эта макрокоманда всегда будет определена, если USE_STDIO_BASE определена.

void *  FILE_base(FILE * f)
FILE_bufsiz

Эта макрокоманда используется для определения количества байтов в буфере ввода-вывода, на который указывает поле _base (или эквивалент) структуры FILE, на которую указывает её аргумент. Эта макрокоманда всегда будет определена, если USE_STDIO_BASE определена.

Size_t  FILE_bufsiz(FILE *f)
FILE_cnt

Эта макрокоманда используется для доступа к полю _cnt (или эквиваленту) структуры FILE, на которую указывает её аргумент. Эта макрокоманда всегда будет определена, если USE_STDIO_PTR определена.

Size_t  FILE_cnt(FILE * f)
FILE_ptr

Эта макрокоманда используется для доступа к полю _ptr (или эквиваленту) структуры FILE, на которую указывает её аргумент. Эта макрокоманда всегда будет определена, если USE_STDIO_PTR определена.

void *  FILE_ptr(FILE * f)
FLEXFILENAMES

Если этот символ определен, это означает, что система поддерживает имена файлов длиннее 14 символов.

HAS_DIR_DD_FD

Если этот символ определен, это означает, что структура dirstream DIR содержит переменную-член с именем dd_fd.

HAS_DUP2

Если этот символ определен, это означает, что доступна функция dup2 для дублирования дескрипторов файлов.

HAS_DUP3

Если этот символ определен, это означает, что доступна функция dup3 для дублирования дескрипторов файлов.

HAS_FAST_STDIO

Если этот символ определен, это означает, что доступна "быстрая библиотека ввода-вывода", позволяющая напрямую манипулировать буферами ввода-вывода.

HAS_FCHDIR

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

HAS_FCNTL

Если этот символ определен, это означает, что программа на C может использовать функцию fcntl().

HAS_FDCLOSE

Если этот символ определен, это означает, что доступна функция fdclose для освобождения структуры FILE без закрытия базового дескриптора файла. Эта функция появилась в FreeBSD 10.2.

HAS_FPATHCONF

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

HAS_FPOS64_T

Этот символ будет определен, если компилятор C поддерживает fpos64_t.

HAS_FSTATFS

Если этот символ определен, это означает, что доступна функция fstatfs для получения информации о файловой системе по дескриптору файла.

HAS_FSTATVFS

Если этот символ определен, это означает, что доступна функция fstatvfs для получения информации о файловой системе по дескриптору файла.

HAS_GETFSSTAT

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

HAS_GETMNT

Если этот символ определен, это означает, что доступна функция getmnt для получения информации о монтировании файловой системы по имени файла.

HAS_GETMNTENT

Если этот символ определен, это означает, что доступна функция getmntent для перебора смонтированных файловых систем и получения информации о них.

HAS_HASMNTOPT

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

HAS_LSEEK_PROTO

Если этот символ определен, это означает, что система предоставляет прототип для функции lseek(). В противном случае программа должна предоставить его самостоятельно. Хороший вариант:

extern off_t lseek(int, off_t, int);
HAS_MKDIR

Если этот символ определен, это означает, что доступна функция mkdir для создания каталогов. В противном случае необходимо создать новый процесс для выполнения /bin/mkdir.

HAS_OFF64_T

Этот символ будет определен, если компилятор C поддерживает off64_t.

HAS_OPEN3

Эта константа позволяет программе на C узнать, что доступна трёхаргументная форма функции open(2).

HAS_OPENAT

Этот символ определён, если доступна функция openat().

HAS_POLL

Если этот символ определен, это означает, что доступна функция poll для опроса активных дескрипторов файлов. Пожалуйста, проверьте I_POLL и I_SYS_POLL, чтобы узнать, какой заголовочный файл необходимо включить.

HAS_READDIR

Если этот символ определен, это означает, что доступна функция readdir для чтения записей каталога. Возможно, потребуется включить dirent.h. См. "I_DIRENT".

HAS_READDIR64_R

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

HAS_REWINDDIR

Если этот символ определен, это означает, что доступна функция rewinddir. Возможно, потребуется включить dirent.h. См. "I_DIRENT".

HAS_RMDIR

Если этот символ определен, это означает, что доступна функция rmdir для удаления каталогов. В противном случае необходимо создать новый процесс для выполнения /bin/rmdir.

HAS_SEEKDIR

Если этот символ определен, это означает, что доступна функция seekdir. Возможно, потребуется включить dirent.h. См. "I_DIRENT".

HAS_SELECT

Если этот символ определен, это означает, что доступна функция select для опроса активных дескрипторов файлов. Если используется поле тайм-аута, может потребоваться включить sys/time.h.

HAS_SETVBUF

Если этот символ определен, это означает, что доступна функция setvbuf для изменения буферизации открытого потока stdio. В частности, чтобы переключиться на построчную буферизацию.

HAS_STDIO_STREAM_ARRAY

Если этот символ определен, это означает, что существует массив, содержащий потоки stdio.

HAS_STRUCT_FS_DATA

Если этот символ определен, это означает, что struct fs_data для выполнения statfs() поддерживается.

HAS_STRUCT_STATFS

Если этот символ определен, это означает, что struct statfs для выполнения statfs() поддерживается.

HAS_STRUCT_STATFS_F_FLAGS

Если этот символ определен, это означает, что struct statfs имеет член f_flags, содержащий флаги монтирования файловой системы, содержащей файл. Такой struct statfs берется из sys/mount.h (BSD) , а не из sys/statfs.h (SYSV). Более старые реализации (например, Ultrix) не имеют statfs() и struct statfs, а имеют ustat() и getmnt() с struct ustat и struct fs_data.

HAS_TELLDIR

Если этот символ определен, это означает, что доступна функция telldir. Возможно, потребуется включить dirent.h. См. "I_DIRENT".

HAS_USTAT

Этот символ, если определен, указывает, что системный вызов ustat доступен для запроса статистики файловой системы с помощью dev_t.

I_FCNTL

Эта константа макроса сообщает программе C о необходимости включить fcntl.h.

#ifdef I_FCNTL
    #include <fcntl.h>
#endif
I_SYS_DIR

Этот символ, если определен, указывает программе C на необходимость включения sys/dir.h.

#ifdef I_SYS_DIR
    #include <sys_dir.h>
#endif
I_SYS_FILE

Этот символ, если определен, указывает программе C на необходимость включения sys/file.h для получения определения R_OK и связанных функций.

#ifdef I_SYS_FILE
    #include <sys_file.h>
#endif
I_SYS_NDIR

Этот символ, если определен, указывает программе C на необходимость включения sys/ndir.h.

#ifdef I_SYS_NDIR
    #include <sys_ndir.h>
#endif
I_SYS_STATFS

Этот символ, если определен, указывает на существование sys/statfs.h.

#ifdef I_SYS_STATFS
    #include <sys_statfs.h>
#endif
LSEEKSIZE

Этот символ содержит количество байтов, используемых Off_t.

RD_NODATA

Этот символ содержит код возврата из read(), когда данные отсутствуют на неблокирующем дескрипторе файла. Будьте внимательны! Если EOF_NONBLOCK не определено, вы не сможете отличить отсутствие данных от EOF путём вызова read(). Вам придется найти другой способ узнать наверняка!

READDIR64_R_PROTO

Этот символ кодирует прототип readdir64_r. Он равен нулю, если d_readdir64_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_readdir64_r определено.

STDCHAR

Этот символ определен как тип char, используемый в stdio.h. Он может иметь значения "unsigned char" или "char".

STDIO_CNT_LVALUE

Этот символ определен, если макрос FILE_cnt может использоваться как lvalue.

STDIO_PTR_LVALUE

Этот символ определен, если макрос FILE_ptr может использоваться как lvalue.

STDIO_PTR_LVAL_NOCHANGE_CNT

Этот символ определен, если использование макроса FILE_ptr как lvalue для увеличения указателя на n не изменяет значение File_cnt(fp).

STDIO_PTR_LVAL_SETS_CNT

Этот символ определен, если использование макроса FILE_ptr как lvalue для увеличения указателя на n вызывает побочный эффект уменьшения значения File_cnt(fp) на n.

STDIO_STREAM_ARRAY

Этот символ указывает имя массива, содержащего потоки stdio. Типичные значения включают _iob, __iob, и __sF.

ST_INO_SIGN

Этот символ содержит знак значения struct stat's st_ino. 1 для беззнакового, -1 для знакового.

ST_INO_SIZE

Эта переменная содержит размер struct stat's st_ino в байтах.

VAL_EAGAIN

Этот символ содержит код ошибки errno, установленный read() при отсутствии данных на неблокирующем дескрипторе файла.

VAL_O_NONBLOCK

Этот символ используется во время open() или fcntl(F_SETFL) для включения неблокирующего ввода-вывода для дескриптора файла. Обратите внимание, что нет возможности вернуться к блокирующему режиму с помощью этого метода. Если вы хотите переключаться между блокирующим и неблокирующим режимом, используйте вызов ioctl(FIOSNBIO) вместо этого, но он не поддерживается всеми устройствами.

VOID_CLOSEDIR

Этот символ, если определен, указывает, что процедура closedir() не возвращает значение.

Точки с плавающей запятой

Также в "Список символов возможностей HAS_foo" перечислены возможности, которые не входят в этот раздел. Например HAS_ASINH, для гиперболического синуса.

CASTFLAGS

Этот символ содержит флаги, указывающие на трудности, которые возникают у компилятора при приведении нестандартных значений с плавающей точкой к unsigned long:

0 = ok
1 = couldn't cast < 0
2 = couldn't cast >= 0x80000000
4 = couldn't cast in argument expression list
CASTNEGFLOAT

Этот символ определен, если C-компилятор может преобразовывать отрицательные числа в unsigned long, int и short.

DOUBLE_HAS_INF

Этот символ, если определен, указывает, что тип double содержит бесконечность.

DOUBLE_HAS_NAN

Этот символ, если определен, указывает, что тип double содержит значение "не число" (NaN).

DOUBLE_HAS_NEGATIVE_ZERO

Этот символ, если определен, указывает, что тип double содержит negative_zero.

DOUBLE_HAS_SUBNORMALS

Этот символ, если определен, указывает, что тип double содержит субнормали (денормали).

DOUBLEINFBYTES

Этот символ, если определен, представляет собой список шестнадцатеричных байтов, разделённых запятыми, для бесконечности двойной точности.

DOUBLEKIND

DOUBLEKIND будет одним из значений DOUBLE_IS_IEEE_754_32_BIT_LITTLE_ENDIAN DOUBLE_IS_IEEE_754_32_BIT_BIG_ENDIAN DOUBLE_IS_IEEE_754_64_BIT_LITTLE_ENDIAN DOUBLE_IS_IEEE_754_64_BIT_BIG_ENDIAN DOUBLE_IS_IEEE_754_128_BIT_LITTLE_ENDIAN DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN DOUBLE_IS_IEEE_754_64_BIT_MIXED_ENDIAN_LE_BE DOUBLE_IS_IEEE_754_64_BIT_MIXED_ENDIAN_BE_LE DOUBLE_IS_VAX_F_FLOAT DOUBLE_IS_VAX_D_FLOAT DOUBLE_IS_VAX_G_FLOAT DOUBLE_IS_IBM_SINGLE_32_BIT DOUBLE_IS_IBM_DOUBLE_64_BIT DOUBLE_IS_CRAY_SINGLE_64_BIT DOUBLE_IS_UNKNOWN_FORMAT

DOUBLEMANTBITS

Этот символ, если определен, указывает, сколько битов мантиссы имеется в формате с плавающей запятой двойной точности. Обратите внимание, что это обычно DBL_MANT_DIG минус один, так как в стандартных форматах IEEE 754 DBL_MANT_DIG включает неявный бит, который фактически не существует.

DOUBLENANBYTES

Этот символ, если определен, представляет собой список шестнадцатеричных байтов (0xHH), разделённых запятыми, для значения "не число" (NaN) двойной точности.

DOUBLESIZE

Этот символ содержит размер типа double, чтобы препроцессор C мог принять решения, основанные на этом значении.

DOUBLE_STYLE_CRAY

Этот символ, если определен, указывает, что тип double имеет формат 64-битного суперкомпьютера CRAY.

DOUBLE_STYLE_IBM

Этот символ, если определен, указывает, что тип double имеет формат 64-битного суперкомпьютера IBM.

DOUBLE_STYLE_IEEE

Этот символ, если определен, указывает, что тип double имеет формат 64-битного стандарта IEEE 754.

DOUBLE_STYLE_VAX

Этот символ, если определен, указывает, что тип double имеет формат 64-битного процессора VAX D или G.

HAS_ATOLF

Этот символ, если определен, указывает, что функция atolf доступна для преобразования строк в long double.

HAS_CLASS

Этот символ, если определен, указывает, что функция class доступна для классификации значений типа double. Доступна, например, в AIX. Возвращаемые значения определены в float.h и следующие:

FP_PLUS_NORM    Positive normalized, nonzero
FP_MINUS_NORM   Negative normalized, nonzero
FP_PLUS_DENORM  Positive denormalized, nonzero
FP_MINUS_DENORM Negative denormalized, nonzero
FP_PLUS_ZERO    +0.0
FP_MINUS_ZERO   -0.0
FP_PLUS_INF     +INF
FP_MINUS_INF    -INF
FP_NANS         Signaling Not a Number (NaNS)
FP_NANQ         Quiet Not a Number (NaNQ)
HAS_FINITE

Этот символ, если определен, указывает, что функция finite доступна для проверки, является ли значение типа double конечным (не бесконечность и не NaN).

HAS_FINITEL

Этот символ, если определен, указывает, что функция finitel доступна для проверки, является ли значение типа long double конечным (не бесконечность и не NaN).

HAS_FPCLASS

Этот символ, если определен, указывает, что функция fpclass доступна для классификации значений типа double. Доступна, например, в Solaris/SVR4. Возвращаемые значения определены в ieeefp.h и следующие:

FP_SNAN         signaling NaN
FP_QNAN         quiet NaN
FP_NINF         negative infinity
FP_PINF         positive infinity
FP_NDENORM      negative denormalized non-zero
FP_PDENORM      positive denormalized non-zero
FP_NZERO        negative zero
FP_PZERO        positive zero
FP_NNORM        negative normalized non-zero
FP_PNORM        positive normalized non-zero
HAS_FPCLASSIFY

Этот символ, если определен, указывает, что функция fpclassify доступна для классификации значений типа double. Доступна, например, в HP-UX. Возвращаемые значения определены в math.h и следующие:

FP_NORMAL     Normalized
FP_ZERO       Zero
FP_INFINITE   Infinity
FP_SUBNORMAL  Denormalized
FP_NAN        NaN
HAS_FPCLASSL

Этот символ, если определен, указывает, что функция fpclassl доступна для классификации значений типа long double. Доступна, например, в IRIX. Возвращаемые значения определены в ieeefp.h и следующие:

FP_SNAN         signaling NaN
FP_QNAN         quiet NaN
FP_NINF         negative infinity
FP_PINF         positive infinity
FP_NDENORM      negative denormalized non-zero
FP_PDENORM      positive denormalized non-zero
FP_NZERO        negative zero
FP_PZERO        positive zero
FP_NNORM        negative normalized non-zero
FP_PNORM        positive normalized non-zero
HAS_FPGETROUND

Этот символ, если определен, указывает, что функция fpgetround доступна для получения режима округления с плавающей запятой.

HAS_FP_CLASS

Этот символ, если определен, указывает, что функция fp_class доступна для классификации значений типа double. Доступна, например, в Digital UNIX. Возвращаемые значения определены в math.h и следующие:

FP_SNAN           Signaling NaN (Not-a-Number)
FP_QNAN           Quiet NaN (Not-a-Number)
FP_POS_INF        +infinity
FP_NEG_INF        -infinity
FP_POS_NORM       Positive normalized
FP_NEG_NORM       Negative normalized
FP_POS_DENORM     Positive denormalized
FP_NEG_DENORM     Negative denormalized
FP_POS_ZERO       +0.0 (positive zero)
FP_NEG_ZERO       -0.0 (negative zero)
HAS_FP_CLASSIFY

Этот символ, если определен, указывает, что функция fp_classify доступна для классификации значений типа double. Возвращаемые значения определены в math.h

FP_NORMAL     Normalized
FP_ZERO       Zero
FP_INFINITE   Infinity
FP_SUBNORMAL  Denormalized
FP_NAN        NaN
HAS_FP_CLASSL

Этот символ, если определен, указывает, что функция fp_classl доступна для классификации значений типа long double. Доступна, например, в Digital UNIX. Возможные значения см. в HAS_FP_CLASS.

HAS_FREXPL

Этот символ, если определен, указывает, что функция frexpl доступна для разделения числа с плавающей запятой long double на нормированную дробь и целую степень двойки.

HAS_ILOGB

Этот символ, если определен, указывает, что функция ilogb доступна для получения целого показателя степени числа с плавающей запятой.

HAS_ISFINITE

Этот символ, если определен, указывает, что функция isfinite доступна для проверки, является ли значение типа double конечным (не бесконечность и не NaN).

HAS_ISFINITEL

Этот символ, если определен, указывает, что функция isfinitel доступна для проверки, является ли значение типа long double конечным (не бесконечность и не NaN).

HAS_ISINF

Этот символ, если определён, указывает, что функция isinf доступна для проверки, является ли двойное значение бесконечностью.

HAS_ISINFL

Этот символ, если определён, указывает, что функция isinfl доступна для проверки, является ли длинное двойное значение бесконечностью.

HAS_ISNAN

Этот символ, если определён, указывает, что функция isnan доступна для проверки, является ли двойное значение NaN.

HAS_ISNANL

Этот символ, если определён, указывает, что функция isnanl доступна для проверки, является ли длинное двойное значение NaN.

HAS_ISNORMAL

Этот символ, если определён, указывает, что функция isnormal доступна для проверки, является ли двойное значение нормализованным (ненулевым и нормализованным).

HAS_J0

Если этот символ определён, то C-программа может использовать функцию j0() для вычисления функции Бесселя первого рода нулевого порядка от двойного значения.

HAS_J0L

Если этот символ определён, то C-программа может использовать функцию j0l() для вычисления функции Бесселя первого рода нулевого порядка от длинного двойного значения.

HAS_LDBL_DIG

Если этот символ определён, это означает, что в float.h или limits.h данной системы определён символ LDBL_DIG, который представляет количество значащих цифр в числе с длинной двойной точностью. В отличие от DBL_DIG, нет хорошего предположения для LDBL_DIG при его неопределённости.

HAS_LDEXPL

Если этот символ определён, то функция ldexpl доступна для сдвига числа с длинной двойной точностью на целую степень двойки.

HAS_LLRINT

Если этот символ определён, то функция llrint доступна для возвращения целого 64-битного значения, ближайшего к двойному значению (согласно текущему режиму округления).

HAS_LLRINTL

Если этот символ определён, то функция llrintl доступна для возвращения целого 64-битного значения, ближайшего к значению с длинной двойной точностью (согласно текущему режиму округления).

HAS_LLROUNDL

Если этот символ определён, то функция llroundl доступна для возвращения ближайшего 64-битного целого значения к значению с длинной двойной точностью, удаляясь от нуля.

HAS_LONG_DOUBLE

Этот символ будет определён, если компилятор C поддерживает длинные двойные значения.

HAS_LRINT

Если этот символ определён, то функция lrint доступна для возвращения целого значения, ближайшего к двойному значению (согласно текущему режиму округления).

HAS_LRINTL

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

HAS_LROUNDL

Если этот символ определён, то функция lroundl доступна для возвращения ближайшего целого значения к значению с длинной двойной точностью, удаляясь от нуля.

HAS_MODFL

Если этот символ определён, то функция modfl доступна для разделения длинного двойного значения x на дробную часть f и целую часть i, такие что |f| < 1.0 и (f + i) = x.

HAS_NAN

Если этот символ определён, то функция nan доступна для генерации NaN.

HAS_NEXTTOWARD

Если этот символ определён, то функция nexttoward доступна для возвращения ближайшего машинного представимого значения длинного двойного числа от x в направлении y.

HAS_REMAINDER

Если этот символ определён, то функция remainder доступна для возвращения дробной части от операции деления.

HAS_SCALBN

Если этот символ определён, то функция scalbn доступна для умножения числа с плавающей точкой на целую степень основания.

HAS_SIGNBIT

Если этот символ определён, то функция signbit доступна для проверки установленного бита знака числа. Это должно включать корректную проверку -0.0. Это будет установлено только в том случае, если функция signbit() безопасна для использования с типом NV, используемым внутри Perl. Пользователи должны вызвать Perl_signbit(), который будет определён как системная функция или макрос signbit(), если этот символ определён.

HAS_SQRTL

Если этот символ определён, то функция sqrtl доступна для вычисления квадратного корня от длинного двойного значения.

HAS_STRTOD_L

Если этот символ определён, то функция strtod_l доступна для преобразования строк в длинные двойные значения.

HAS_STRTOLD

Если этот символ определён, то функция strtold доступна для преобразования строк в длинные двойные значения.

HAS_STRTOLD_L

Если этот символ определён, то функция strtold_l доступна для преобразования строк в длинные двойные значения.

HAS_TRUNC

Если этот символ определён, то функция trunc доступна для округления двойного значения к нулю.

HAS_UNORDERED

Если этот символ определён, то функция unordered доступна для проверки, являются ли два двойных значения неупорядоченными (эффективно: является ли хотя бы одно из них NaN).

I_FENV

Если этот символ определён, то C-программе следует включить заголовок fenv.h для получения определений окружения с плавающей точкой.

#ifdef I_FENV
    #include <fenv.h>
#endif
I_QUADMATH

Если этот символ определён, то заголовок quadmath.h существует и должен быть включён.

#ifdef I_QUADMATH
    #include <quadmath.h>
#endif
LONGDBLINFBYTES

Если этот символ определён, это список шестнадцатеричных байтов, отделённых запятыми, для значения бесконечности длинной двойной точности.

LONGDBLMANTBITS

Если этот символ определён, он указывает количество битов мантиссы в формате числа с плавающей точкой длинной двойной точности. Обратите внимание, что это может быть LDBL_MANT_DIG минус один, так как LDBL_MANT_DIG может включать неявный бит IEEE 754. Общий формат длинной двойной точности типа x86-80 не имеет неявного бита.

LONGDBLNANBYTES

Если этот символ определён, это список шестнадцатеричных байтов (0xHH), отделённых запятыми, для значения "не число" (NaN) длинной двойной точности.

LONG_DOUBLEKIND

LONG_DOUBLEKIND будет одним из LONG_DOUBLE_IS_DOUBLE LONG_DOUBLE_IS_IEEE_754_128_BIT_LITTLE_ENDIAN LONG_DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN LONG_DOUBLE_IS_X86_80_BIT_LITTLE_ENDIAN LONG_DOUBLE_IS_X86_80_BIT_BIG_ENDIAN LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_LE LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_BE LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_LE LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LITTLE_ENDIAN LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BIG_ENDIAN LONG_DOUBLE_IS_VAX_H_FLOAT LONG_DOUBLE_IS_UNKNOWN_FORMAT. Он определён только если система поддерживает длинные двойные значения.

LONG_DOUBLESIZE

Этот символ содержит размер длинного двойного значения, чтобы препроцессор C мог принимать решения на его основе. Определён только если система поддерживает длинные двойные значения. Обратите внимание, что это sizeof(long double), который может включать неиспользуемые байты.

LONG_DOUBLE_STYLE_IEEE

Если этот символ определён, то длинное двойное значение соответствует какому-либо из форматов IEEE 754: LONG_DOUBLE_STYLE_IEEE_STD, LONG_DOUBLE_STYLE_IEEE_EXTENDED, LONG_DOUBLE_STYLE_IEEE_DOUBLEDOUBLE.

LONG_DOUBLE_STYLE_IEEE_DOUBLEDOUBLE

Если этот символ определён, то длинное двойное значение — 128-битное число двойной точности.

LONG_DOUBLE_STYLE_IEEE_EXTENDED

Если этот символ определён, то длинное двойное значение — 80-битный расширенный формат IEEE 754. Заметьте, что несмотря на "расширенный", он меньше, чем "стандартный", так как это расширение двойной точности.

LONG_DOUBLE_STYLE_IEEE_STD

Если этот символ определён, то длинное двойное значение — 128-битный стандартный формат IEEE 754.

LONG_DOUBLE_STYLE_VAX

Если этот символ определён, то длинное двойное значение соответствует 128-битному формату VAX H.

NV

Описание в perlguts.

NVMANTBITS

Если этот символ определён, он указывает количество битов мантиссы (без неявного бита) в Perl NV. Это зависит от выбранного типа с плавающей точкой.

NV_OVERFLOWS_INTEGERS_AT

Этот символ указывает наибольшее целое значение, которое могут хранить NV. Это значение + 1.0 не может быть хранено точно. Оно выражается как константа с плавающей точкой, чтобы уменьшить вероятность проблем при преобразовании между десятичной и двоичной системами. Если значение определить невозможно, возвращается 0.

NV_PRESERVES_UV

Если этот символ определён, это означает, что переменная типа NVTYPE может сохранять все биты переменной типа UVTYPE.

NV_PRESERVES_UV_BITS

Этот символ содержит количество битов, которые переменная типа NVTYPE может сохранить от переменной типа UVTYPE.

NVSIZE

Этот символ содержит размер sizeof(NV). Обратите внимание, что некоторые форматы чисел с плавающей точкой содержат неиспользуемые байты. Наиболее заметный пример — 80-битная расширенная точность x86*, размер которой составляет 12 и 16 байтов для 32 и 64-битных платформ соответственно, но использует только 10 байтов. Perl, скомпилированный с -Duselongdouble на x86*, имеет такую же особенность.

NVTYPE

Этот символ определяет тип C, используемый для Perl NV.

NV_ZERO_IS_ALLBITS_ZERO

Если этот символ определён, то переменная типа NVTYPE хранит 0.0 в памяти как все биты ноль.

Общие настройки

В этом разделе содержится конфигурационная информация, отсутствующая в других, более специализированных разделах данного документа. В конце приведён список #defines, названия которых должны быть достаточно информативными, а также список #defines, которые указывают, необходимо ли включить #include файлы для получения соответствующей функциональности.

BYTEORDER

Эта переменная содержит шестнадцатеричную константу, определённую в byteorder, в формате UV, например, 0x1234 или 0x4321 или 0x12345678 и т. д. Если компилятор поддерживает кросс-компиляцию или бинарные файлы для нескольких архитектур, используйте макросы, определённые компилятором, для определения порядка байтов.

CHARBITS

Эта переменная содержит размер типа char, чтобы препроцессор C мог принимать решения, основанные на нём.

DB_VERSION_MAJOR_CFG

Если эта переменная определена, она содержит номер основной версии Berkeley DB, найденной в заголовочном файле db.h при конфигурировании Perl.

DB_VERSION_MINOR_CFG

Если эта переменная определена, она содержит номер дополнительной версии Berkeley DB, найденной в заголовочном файле db.h при конфигурировании Perl. Для версии DB 1 она всегда равна 0.

DB_VERSION_PATCH_CFG

Если эта переменная определена, она содержит номер патча версии Berkeley DB, найденной в заголовочном файле db.h при конфигурировании Perl. Для версии DB 1 она всегда равна 0.

DEFAULT_INC_EXCLUDES_DOT

Если эта переменная определена, она отключает устаревшее поведение по умолчанию, включающее «.» в конце @INC.

DLSYM_NEEDS_UNDERSCORE

Если эта переменная определена, она указывает, что нам нужно добавить нижнее подчёркивание к имени символа перед вызовом dlsym(). Это имеет смысл только если у вас есть функция dlsym, что мы предполагаем, если вы используете dl_dlopen.xs.

EBCDIC

Если эта переменная определена, она указывает, что система использует кодировку EBCDIC.

HAS_CSH

Если эта переменная определена, она указывает, что оболочка C-shell существует.

HAS_GETHOSTNAME

Если эта переменная определена, она указывает, что C-программа может использовать функцию gethostname() для получения имени хоста. См. также "HAS_UNAME" и "PHOSTNAME".

HAS_GNULIBC

Если эта переменная определена, она указывает C-программе, что используется библиотека C GNU. Лучше использовать символы __GLIBC__ и __GLIBC_MINOR__, предоставленные glibc.

HAS_LGAMMA

Если эта переменная определена, она указывает, что функция lgamma доступна для вычисления логарифма гамма-функции. См. также "HAS_TGAMMA" и "HAS_LGAMMA_R".

HAS_LGAMMA_R

Если эта переменная определена, она указывает, что функция lgamma_r доступна для вычисления логарифма гамма-функции без использования глобальной переменной signgam.

HAS_NON_INT_BITFIELDS

Если эта переменная определена, она указывает, что компилятор C без ошибок или предупреждений принимает битовые поля struct bitfields, объявленные с размером, отличным от простого 'int'; например, 'unsigned char' принимается.

HAS_PRCTL_SET_NAME

Если эта переменная определена, она указывает, что функция prctl доступна для установки заголовка процесса и поддерживает PR_SET_NAME.

HAS_PROCSELFEXE

Эта переменная определена, если PROCSELFEXE_PATH является символической ссылкой на абсолютный путь выполняемой программы.

HAS_PSEUDOFORK

Если эта переменная определена, она указывает, что доступна эмуляция функции fork.

HAS_REGCOMP

Если эта переменная определена, она указывает, что функция regcomp() доступна для выполнения сопоставления с регулярным выражением (обычно на системах, соответствующих POSIX.2).

HAS_SETPGID

Если эта переменная определена, она указывает, что функция setpgid(pid, gpid) доступна для установки идентификатора группы процессов.

HAS_SIGSETJMP

Эта переменная указывает C-программе, что функция sigsetjmp() доступна для сохранения регистров и среды стека вызывающего процесса для последующего использования siglongjmp(), а также для необязательного сохранения маски сигналов процесса. См. "Sigjmp_buf", "Sigsetjmp", и "Siglongjmp".

HAS_STRUCT_CMSGHDR

Если эта переменная определена, она указывает, что struct cmsghdr поддерживается.

HAS_STRUCT_MSGHDR

Если эта переменная определена, она указывает, что struct msghdr поддерживается.

HAS_TGAMMA

Если эта переменная определена, она указывает, что функция tgamma доступна для вычисления гамма-функции. См. также "HAS_LGAMMA".

HAS_UNAME

Если эта переменная определена, она указывает, что C-программа может использовать функцию uname() для получения имени хоста. См. также "HAS_GETHOSTNAME" и "PHOSTNAME".

HAS_UNION_SEMUN

Если эта переменная определена, она указывает, что union semun определена при включении sys/sem.h. В противном случае, код пользователя, вероятно, должен определить её как:

union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
}
I_DIRENT

Если эта переменная определена, она указывает C-программе, что она должна включить dirent.h. Использование этого символа также приводит к определению макроса Direntry_t, который в конечном итоге будет 'struct dirent' или 'struct direct' в зависимости от наличия dirent.h.

#ifdef I_DIRENT
    #include <dirent.h>
#endif
I_POLL

Если эта переменная определена, она указывает, что poll.h существует и должно быть включено. (см. также "HAS_POLL")

#ifdef I_POLL
    #include <poll.h>
#endif
I_SYS_RESOURCE

Если эта переменная определена, она указывает C-программе, что она должна включить sys/resource.h.

#ifdef I_SYS_RESOURCE
    #include <sys_resource.h>
#endif
LIBM_LIB_VERSION

Если эта переменная определена, она указывает, что libm экспортирует _LIB_VERSION и что math.h определяет перечисление для работы с ним.

NEED_VA_COPY

Если эта переменная определена, она указывает, что система хранит тип данных списка переменных аргументов, va_list, в формате, который нельзя скопировать простым присваиванием, поэтому для копирования необходимо использовать другие средства. Поскольку системы различаются по предоставлению (или отсутствию) механизмов копирования, handy.h определяет независимый от платформы макрос Perl_va_copy(src, dst) для выполнения этой задачи.

OSNAME

Эта переменная содержит имя операционной системы, определённое утилитой Configure. Не стоит слишком полагаться на неё; тесты на наличие конкретных функций, заданные Configure, как правило, более надёжны.

OSVERS

Эта переменная содержит версию операционной системы, определённую утилитой Configure. Не стоит слишком полагаться на неё; тесты на наличие конкретных функций, заданные Configure, как правило, более надёжны.

PHOSTNAME

Если эта переменная определена, она указывает команду, которую необходимо передать функции popen() для получения имени хоста. См. также "HAS_GETHOSTNAME" и "HAS_UNAME". Обратите внимание, что команда использует полный путь, что безопасно даже если используется процессом с привилегиями суперпользователя.

PROCSELFEXE_PATH

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

PTRSIZE

Эта переменная содержит размер указателя, чтобы препроцессор C мог принимать решения, основанные на нём. Она будет равна sizeof(void *), если компилятор поддерживает (void *); в противном случае она будет равна sizeof(char *).

RANDBITS

Эта переменная указывает, сколько бит генерирует функция, используемая для генерации нормированных случайных чисел. Значения включают 15, 16, 31 и 48.

SELECT_MIN_BITS

Эта переменная содержит минимальное количество бит, обрабатываемых функцией select. То есть, если вы используете select(n, ...), сколько бит как минимум будет очищено в маске, если будет обнаружена какая-либо активность. Обычно это либо n, либо 32*ceil(n/32), особенно на многих малозначащих системах, последние выполняется. Это полезно только если у вас есть select(), естественно.

SETUID_SCRIPTS_ARE_SECURE_NOW

Если эта переменная определена, она указывает, что ошибка, которая мешает setuid-скриптам быть безопасными, отсутствует в этой операционной системе.

ST_DEV_SIGN

Эта переменная содержит знак struct stat's st_dev. 1 для беззнакового, -1 для знакового.

ST_DEV_SIZE

Эта переменная содержит размер struct stat's st_dev в байтах.

Список символов возможностей HAS_foo

Это список символов, которые не появляются в других местах этого документа и указывают, имеет ли текущая платформа определённую возможность. Все их имена начинаются с HAS_. Здесь перечислены только те символы, чья возможность напрямую выводится из имени. Все остальные имеют своё значение, расширенное в другом месте документа. Этот (относительно) компактный список, потому что мы считаем, что расширение добавит мало или не добавит ценности и займёт много места (потому что их очень много). Если вы считаете, что некоторые из них нужно расширить, отправьте письмо на адрес perl5-porters@perl.org.

Каждый символ здесь будет #defined тогда и только тогда, когда платформа обладает соответствующей возможностью. Если вам нужна более подробная информация, см. соответствующую запись в config.h. Для удобства список разделён так, что те, которые указывают на существование рекурсивной версии возможности, перечислены отдельно.

END_OF_DOCUMENT_MARKER

HAS_ACCEPT4, HAS_ACCESS, HAS_ACCESSX, HAS_ACOSH, HAS_AINTL, HAS_ALARM, HAS_ASINH, HAS_ATANH, HAS_ATOLL, HAS_CBRT, HAS_CHOWN, HAS_CHROOT, HAS_CHSIZE, HAS_CLEARENV, HAS_COPYSIGN, HAS_COPYSIGNL, HAS_CRYPT, HAS_CTERMID, HAS_CUSERID, HAS_DIRFD, HAS_DLADDR, HAS_DLERROR, HAS_EACCESS, HAS_ENDHOSTENT, HAS_ENDNETENT, HAS_ENDPROTOENT, HAS_ENDSERVENT, HAS_ERF, HAS_ERFC, HAS_EXP2, HAS_EXPM1, HAS_FCHMOD, HAS_FCHMODAT, HAS_FCHOWN, HAS_FDIM, HAS_FD_SET, HAS_FEGETROUND, HAS_FFS, HAS_FFSL, HAS_FGETPOS, HAS_FLOCK, HAS_FMA, HAS_FMAX, HAS_FMIN, HAS_FORK, HAS_FSEEKO, HAS_FSETPOS, HAS_FSYNC, HAS_FTELLO, HAS_GAI_STRERROR, HAS_GETADDRINFO, HAS_GETCWD, HAS_GETESPWNAM, HAS_GETGROUPS, HAS_GETHOSTBYADDR, HAS_GETHOSTBYNAME, HAS_GETHOSTENT, HAS_GETLOGIN, HAS_GETNAMEINFO, HAS_GETNETBYADDR, HAS_GETNETBYNAME, HAS_GETNETENT, HAS_GETPAGESIZE, HAS_GETPGID, HAS_GETPGRP, HAS_GETPGRP2, HAS_GETPPID, HAS_GETPRIORITY, HAS_GETPROTOBYNAME, HAS_GETPROTOBYNUMBER, HAS_GETPROTOENT, HAS_GETPRPWNAM, HAS_GETSERVBYNAME, HAS_GETSERVBYPORT, HAS_GETSERVENT, HAS_GETSPNAM, HAS_HTONL, HAS_HTONS, HAS_HYPOT, HAS_ILOGBL, HAS_INETNTOP, HAS_INETPTON, HAS_INET_ATON, HAS_IPV6_MREQ, HAS_IPV6_MREQ_SOURCE, HAS_IP_MREQ, HAS_IP_MREQ_SOURCE, HAS_ISASCII, HAS_ISBLANK, HAS_ISLESS, HAS_KILLPG, HAS_LCHOWN, HAS_LINK, HAS_LINKAT, HAS_LLROUND, HAS_LOCKF, HAS_LOG1P, HAS_LOG2, HAS_LOGB, HAS_LROUND, HAS_LSTAT, HAS_MADVISE, HAS_MBLEN, HAS_MBRLEN, HAS_MBRTOWC, HAS_MBSTOWCS, HAS_MBTOWC, HAS_MEMMEM, HAS_MEMRCHR, HAS_MKDTEMP, HAS_MKFIFO, HAS_MKOSTEMP, HAS_MKSTEMP, HAS_MKSTEMPS, HAS_MMAP, HAS_MPROTECT, HAS_MSG, HAS_MSYNC, HAS_MUNMAP, HAS_NEARBYINT, HAS_NEXTAFTER, HAS_NICE, HAS_NTOHL, HAS_NTOHS, HAS_PATHCONF, HAS_PAUSE, HAS_PHOSTNAME, HAS_PIPE, HAS_PIPE2, HAS_PRCTL, HAS_PTRDIFF_T, HAS_READLINK, HAS_READV, HAS_RECVMSG, HAS_REMQUO, HAS_RENAME, HAS_RENAMEAT, HAS_RINT, HAS_ROUND, HAS_SCALBNL, HAS_SEM, HAS_SENDMSG, HAS_SETEGID, HAS_SETEUID, HAS_SETGROUPS, HAS_SETHOSTENT, HAS_SETLINEBUF, HAS_SETNETENT, HAS_SETPGRP, HAS_SETPGRP2, HAS_SETPRIORITY, HAS_SETPROCTITLE, HAS_SETPROTOENT, HAS_SETREGID, HAS_SETRESGID, HAS_SETRESUID, HAS_SETREUID, HAS_SETRGID, HAS_SETRUID, HAS_SETSERVENT, HAS_SETSID, HAS_SHM, HAS_SIGACTION, HAS_SIGPROCMASK, HAS_SIN6_SCOPE_ID, HAS_SNPRINTF, HAS_STAT, HAS_STRCOLL, HAS_STRERROR_L, HAS_STRLCAT, HAS_STRLCPY, HAS_STRNLEN, HAS_STRTOD, HAS_STRTOL, HAS_STRTOLL, HAS_STRTOQ, HAS_STRTOUL, HAS_STRTOULL, HAS_STRTOUQ, HAS_STRXFRM, HAS_STRXFRM_L, HAS_SYMLINK, HAS_SYSCALL, HAS_SYSCONF, HAS_SYSTEM, HAS_SYS_ERRLIST, HAS_TCGETPGRP, HAS_TCSETPGRP, HAS_TOWLOWER, HAS_TOWUPPER, HAS_TRUNCATE, HAS_TRUNCL, HAS_UALARM, HAS_UMASK, HAS_UNLINKAT, HAS_UNSETENV, HAS_VFORK, HAS_VSNPRINTF, HAS_WAIT4, HAS_WAITPID, HAS_WCRTOMB, HAS_WCSCMP, HAS_WCSTOMBS, HAS_WCSXFRM, HAS_WCTOMB, HAS_WRITEV, HAS__FWALK, HAS_CRYPT_R, HAS_CTERMID_R, HAS_DRAND48_R, HAS_ENDHOSTENT_R, HAS_ENDNETENT_R, HAS_ENDPROTOENT_R, HAS_ENDSERVENT_R, HAS_GETGRGID_R, HAS_GETGRNAM_R, HAS_GETHOSTBYADDR_R, HAS_GETHOSTBYNAME_R, HAS_GETHOSTENT_R, HAS_GETLOGIN_R, HAS_GETNETBYADDR_R, HAS_GETNETBYNAME_R, HAS_GETNETENT_R, HAS_GETPROTOBYNAME_R, HAS_GETPROTOBYNUMBER_R, HAS_GETPROTOENT_R, HAS_GETPWNAM_R, HAS_GETPWUID_R, HAS_GETSERVBYNAME_R, HAS_GETSERVBYPORT_R, HAS_GETSERVENT_R, HAS_GETSPNAM_R, HAS_RANDOM_R, HAS_READDIR_R, HAS_SETHOSTENT_R, HAS_SETNETENT_R, HAS_SETPROTOENT_R, HAS_SETSERVENT_R, HAS_SRAND48_R, HAS_SRANDOM_R, HAS_STRERROR_R, HAS_TMPNAM_R, HAS_TTYNAME_R,

#ifdef HAS_STRNLEN
  use strnlen()
#else
  use an alternative implementation
#endif
, #ifdef HAS_STRNLEN use strnlen() #else use an alternative implementation #endif, #include, #include, #include, #define, I_ARPA_INET, I_BFD, I_CRYPT, I_DBM, I_DLFCN, I_EXECINFO, I_FP, I_FP_CLASS, I_GDBM, I_GDBMNDBM, I_GDBM_NDBM, I_GRP, I_IEEEFP, I_INTTYPES, I_LIBUTIL, I_MNTENT, I_NDBM, I_NETDB, I_NETINET_IN, I_NETINET_TCP, I_NET_ERRNO, I_PROT, I_PWD, I_RPCSVC_DBM, I_SGTTY, I_SHADOW, I_STDBOOL, I_STDINT, I_SUNMATH, I_SYSLOG, I_SYSMODE, I_SYSUIO, I_SYSUTSNAME, I_SYS_ACCESS, I_SYS_IOCTL, I_SYS_MOUNT, I_SYS_PARAM, I_SYS_POLL, I_SYS_SECURITY, I_SYS_SELECT, I_SYS_STAT, I_SYS_STATVFS, I_SYS_TIME, I_SYS_TIMES, I_SYS_TIME_KERNEL, I_SYS_TYPES, I_SYS_UN, I_SYS_VFS, I_SYS_WAIT, I_TERMIO, I_TERMIOS, I_UNISTD, I_USTAT, I_VFORK, I_WCHAR, I_WCTYPE,
#ifdef I_WCHAR
  #include <wchar.h>
#endif
, #ifdef I_WCHAR #include <wchar.h> #endif, PL_check

И, возможности реентера:

HAS_CRYPT_R, HAS_CTERMID_R, HAS_DRAND48_R, HAS_ENDHOSTENT_R, HAS_ENDNETENT_R, HAS_ENDPROTOENT_R, HAS_ENDSERVENT_R, HAS_GETGRGID_R, HAS_GETGRNAM_R, HAS_GETHOSTBYADDR_R, HAS_GETHOSTBYNAME_R, HAS_GETHOSTENT_R, HAS_GETLOGIN_R, HAS_GETNETBYADDR_R, HAS_GETNETBYNAME_R, HAS_GETNETENT_R, HAS_GETPROTOBYNAME_R, HAS_GETPROTOBYNUMBER_R, HAS_GETPROTOENT_R, HAS_GETPWNAM_R, HAS_GETPWUID_R, HAS_GETSERVBYNAME_R, HAS_GETSERVBYPORT_R, HAS_GETSERVENT_R, HAS_GETSPNAM_R, HAS_RANDOM_R, HAS_READDIR_R, HAS_SETHOSTENT_R, HAS_SETNETENT_R, HAS_SETPROTOENT_R, HAS_SETSERVENT_R, HAS_SRAND48_R, HAS_SRANDOM_R, HAS_STRERROR_R, HAS_TMPNAM_R, HAS_TTYNAME_R

Пример использования:

#ifdef HAS_STRNLEN
  use strnlen()
#else
  use an alternative implementation
#endif

Список #include необходимых символов

Этот список содержит символы, указывающие, присутствуют ли определенные #include файлы на платформе. Если ваш код использует функциональность, для которой один из них нужен, вам нужно #include его, если символ в этом списке #defined. Для более подробной информации см. соответствующую запись в config.h.

I_ARPA_INET, I_BFD, I_CRYPT, I_DBM, I_DLFCN, I_EXECINFO, I_FP, I_FP_CLASS, I_GDBM, I_GDBMNDBM, I_GDBM_NDBM, I_GRP, I_IEEEFP, I_INTTYPES, I_LIBUTIL, I_MNTENT, I_NDBM, I_NETDB, I_NETINET_IN, I_NETINET_TCP, I_NET_ERRNO, I_PROT, I_PWD, I_RPCSVC_DBM, I_SGTTY, I_SHADOW, I_STDBOOL, I_STDINT, I_SUNMATH, I_SYSLOG, I_SYSMODE, I_SYSUIO, I_SYSUTSNAME, I_SYS_ACCESS, I_SYS_IOCTL, I_SYS_MOUNT, I_SYS_PARAM, I_SYS_POLL, I_SYS_SECURITY, I_SYS_SELECT, I_SYS_STAT, I_SYS_STATVFS, I_SYS_TIME, I_SYS_TIMES, I_SYS_TIME_KERNEL, I_SYS_TYPES, I_SYS_UN, I_SYS_VFS, I_SYS_WAIT, I_TERMIO, I_TERMIOS, I_UNISTD, I_USTAT, I_VFORK, I_WCHAR, I_WCTYPE

Пример использования:

#ifdef I_WCHAR
  #include <wchar.h>
#endif

Глобальные переменные

Эти переменные глобальны для всего процесса. Они совместно используются всеми интерпретаторами и всеми потоками в процессе. Любые переменные, не описанные здесь, могут быть изменены или удалены без предварительного уведомления, поэтому не используйте их! Если вам кажется, что вам действительно нужно использовать неописанную переменную, сначала отправьте электронное письмо на адрес perl5-porters@perl.org. Возможно, кто-то там укажет способ достижения того, что вам нужно, без использования внутренней переменной. Но если нет, вы должны получить разрешение на документирование и последующее использование переменной.

PL_check

Массив, индексированный по коду операции, функций, которые будут вызываться на фазе «проверки» построения дерева optree во время компиляции Perl-кода. Для большинства (но не всех) типов операторов, после того, как оператор был первоначально построен и заполнен операторами-потомками, он будет отфильтрован через функцию проверки, на которую ссылается соответствующий элемент этого массива. Новый оператор передается в качестве единственного аргумента функции проверки, а функция проверки возвращает завершённый оператор. Функция проверки может (как следует из названия) проверить оператор на валидность и сигнализировать об ошибках. Она также может инициализировать или изменить части операторов, или выполнить более радикальную операцию, такую как добавление или удаление операторов-потомков, или даже выбросить оператор и вернуть на его место другой оператор.

Этот массив указателей на функции — удобное место для подключения к процессу компиляции. Модуль XS может поместить свою собственную пользовательскую функцию проверки вместо любой из стандартных, чтобы повлиять на компиляцию определенного типа оператора. Однако пользовательская функция проверки никогда не должна полностью заменять стандартную функцию проверки (или даже пользовательскую функцию проверки из другого модуля). Модуль, изменяющий проверку, должен вместо этого обрамлять существующую функцию проверки. Пользовательская функция проверки должна быть избирательной в отношении того, когда применять своё пользовательское поведение. В обычном случае, когда она решает ничего особенного не делать с оператором, она должна передавать выполнение существующей функции оператора. Таким образом, функции проверки связаны в цепочке, и в конце находится базовая функция проверки ядра.

Для обеспечения безопасности потоков модули не должны писать напрямую в этот массив. Вместо этого используйте функцию "wrap_op_checker".

PL_keyword_plugin

ПРИМЕЧАНИЕ: PL_keyword_plugin является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Указатель на функцию, используемую для обработки расширенных ключевых слов. Функция должна быть объявлена как

int keyword_plugin_function(pTHX_
        char *keyword_ptr, STRLEN keyword_len,
        OP **op_ptr)

Функция вызывается анализатором токенов всякий раз, когда встречается потенциальное ключевое слово. keyword_ptr указывает на слово в буфере ввода парсера, а keyword_len — на его длину; оно не имеет нулевого завершения. Функция должна проверить слово и, возможно, другие состояния, такие как %^H, чтобы определить, нужно ли обработать его как расширенное ключевое слово. Если нет, функция должна вернуть KEYWORD_PLUGIN_DECLINE, и процесс обычного парсера продолжится.

Если функция хочет обработать ключевое слово, она должна сначала разобрать всё, что следует за ключевым словом и является частью синтаксиса, введённого этим ключевым словом. Подробности см. в разделе "Интерфейс лексического анализатора".

При обработке ключевого слова функция-плагин должна построить дерево структур OP, представляющих обработанный код. Корень дерева должен быть сохранён в *op_ptr. Затем функция возвращает константу, указывающую синтаксическую роль обработанной конструкции: KEYWORD_PLUGIN_STMT если это полное утверждение или KEYWORD_PLUGIN_EXPR если это выражение. Обратите внимание, что конструкция-утверждение не может использоваться внутри выражения (кроме как через do BLOCK и аналогичные), а выражение не является полным утверждением (требуется, по крайней мере, заключительная точка с запятой).

При обработке ключевого слова функция-плагин также может иметь побочные эффекты (во время компиляции). Она может изменять %^H, определять функции и так далее. Как правило, если побочные эффекты являются главной целью обработчика, он не хочет генерировать никакие операции для включения в обычную компиляцию. В этом случае всё ещё требуется предоставить дерево операций, но достаточно сгенерировать одну нулевую операцию.

Вот как функция *PL_keyword_plugin должна себя вести в целом. Однако обычно не заменяют полностью существующую функцию-обработчик. Вместо этого сделайте копию PL_keyword_plugin перед назначением собственного указателя на функцию. Ваша функция-обработчик должна искать ключевые слова, которые её интересуют, и обрабатывать их. В тех случаях, когда она не заинтересована, она должна вызвать сохранённую функцию-плагин, передав ей полученные аргументы. Таким образом, PL_keyword_plugin фактически указывает на цепочку функций-обработчиков, каждая из которых имеет возможность обработать ключевые слова, и только последняя функция в цепочке (встроенная в ядро Perl) обычно вернёт KEYWORD_PLUGIN_DECLINE.

Для обеспечения потоковой безопасности модули не должны напрямую устанавливать эту переменную. Вместо этого используйте функцию "wrap_keyword_plugin".

PL_phase

Значение, указывающее текущую фазу интерпретатора Perl. Возможные значения включают PERL_PHASE_CONSTRUCT, PERL_PHASE_START, PERL_PHASE_CHECK, PERL_PHASE_INIT, PERL_PHASE_RUN, PERL_PHASE_END, и PERL_PHASE_DESTRUCT.

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

if (PL_phase == PERL_PHASE_DESTRUCT) {
    // we are in global destruction
}

PL_phase был введён в Perl 5.14; в более ранних версиях Perl вы можете использовать PL_dirty (булево значение) для определения, находится ли интерпретатор в глобальной стадии уничтожения. (Использование PL_dirty не рекомендуется с версии 5.14.)

enum perl_phase  PL_phase

Обработка GV и стеки

GV — это структура, которая соответствует перловому типуглобу, например, *foo. Это структура, которая содержит указатель на скаляр, массив, хеш и т. д., соответствующий $foo, @foo, %foo.

GV обычно встречаются в качестве значений в стеках (хешах таблицы символов), где Perl хранит свои глобальные переменные.

Стек — это хеш, который содержит все переменные, определённые внутри пакета. См. "Стеки и глобы" в perlguts

amagic_call

Выполните перегруженную (активную магическую) операцию, заданную method. method — одно из значений, найденных в overload.h.

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

AMGf_noleft

left не должен использоваться в этой операции.

AMGf_noright

right не должен использоваться в этой операции.

AMGf_unary

Операция выполняется только с одним операндом.

AMGf_assign

Операция изменяет один из операндов, например, $x += 1

SV*  amagic_call(SV* left, SV* right, int method, int dir)
amagic_deref_call

Выполните перегрузку разыменования (active magic) для ref, вернув результат разыменования. method должно быть одной из операций разыменования, указанных в overload.h.

Если перегрузка выключена для ref, возвращает ref само.

SV *  amagic_deref_call(SV *ref, int method)
gv_add_by_type

Убедитесь, что в GV gv есть ячейка типа type.

GV*  gv_add_by_type(GV *gv, svtype type)
Gv_AMupdate

Пересчитывает магию перегрузки в пакете, заданном stash.

Возвращает:

1 при успехе и наличии перегрузки
0, если перегрузка отсутствует
-1, если произошла ошибка, и нельзя было вызвать croak (потому что destructing равно true).
int  Gv_AMupdate(HV* stash, bool destructing)
gv_autoload4

Эквивалентно "gv_autoload_pvn".

GV*  gv_autoload4(HV* stash, const char* name, STRLEN len,
                  I32 method)
GvAV

Возвращает AV из GV.

AV*  GvAV(GV* gv)
gv_AVadd
gv_HVadd
gv_IOadd
gv_SVadd

Убедитесь, что в GV gv есть ячейка заданного типа (AV, HV, IO, SV).

GV*  gv_AVadd(GV *gv)
GV*  gv_HVadd(GV *gv)
GV*  gv_IOadd(GV* gv)
GV*  gv_SVadd(GV *gv)
gv_const_sv

Если gv — это типглоб, чей субрутинный записной элемент — это константный суб, подходящий для встраивания, или gv — это заполнитель ссылки, который будет повышен до такого типаглоба, то возвращает значение, возвращаемое суб. В противном случае возвращает NULL.

SV*  gv_const_sv(GV* gv)
GvCV

Возвращает CV из GV.

CV*  GvCV(GV* gv)
gv_fetchfile
gv_fetchfile_flags

Эти функции возвращают глобал дебаггера для файла (скомпилированного Perl), имя которого задано параметром name.

В настоящее время между этими функциями есть ровно два отличия.

Параметр name для gv_fetchfile — это строка C, означающая, что она имеет нулевое завершение; в то время как параметр name для gv_fetchfile_flags — это строка Perl, длина которой (в байтах) передаётся через параметр namelen Это означает, что имя может содержать вставленные символы NUL. namelen не существует в обычном gv_fetchfile.

Другое отличие заключается в том, что у gv_fetchfile_flags есть дополнительный параметр flags, который в настоящее время полностью игнорируется, но позволяет в будущем добавлять расширения.

GV*  gv_fetchfile      (const char* name)
GV*  gv_fetchfile_flags(const char *const name, const STRLEN len,
                        const U32 flags)
gv_fetchmeth

Подобно "gv_fetchmeth_pvn", но без параметра флагов.

GV*  gv_fetchmeth(HV* stash, const char* name, STRLEN len,
                  I32 level)
gv_fetchmethod

См. "gv_fetchmethod_autoload".

GV*  gv_fetchmethod(HV* stash, const char* name)
gv_fetchmethod_autoload

Возвращает типглоб, содержащий подпрограмму, которую нужно вызвать, чтобы вызвать метод для stash. Фактически, в присутствии автоматической загрузки это может быть типглоб для "AUTOLOAD". В этом случае соответствующая переменная $AUTOLOAD уже настроена.

Третий параметр gv_fetchmethod_autoload определяет, будет ли выполняться поиск AUTOLOAD, если заданный метод отсутствует: ненулевое значение означает «да», ищем AUTOLOAD; нулевое значение означает «нет», не ищем AUTOLOAD. Вызов gv_fetchmethod эквивалентен вызову gv_fetchmethod_autoload с ненулевым параметром autoload.

Эти функции предоставляют "SUPER" в качестве префикса имени метода. Обратите внимание, что если вы хотите сохранить возвращённый типглоб на долгое время, вам нужно проверить, является ли он "AUTOLOAD", так как в более позднее время вызов может загрузить другую подпрограмму из-за изменения значения $AUTOLOAD. Используйте созданный типглоб как побочный эффект, чтобы сделать это.

Эти функции имеют те же побочные эффекты, что и gv_fetchmeth с level==0. Предупреждение о том, что нельзя передавать GV, возвращённый gv_fetchmeth в call_sv, в равной степени относится к этим функциям.

GV*  gv_fetchmethod_autoload(HV* stash, const char* name,
                             I32 autoload)
gv_fetchmeth_autoload

Это старый формат "gv_fetchmeth_pvn_autoload", который не имеет параметра флагов.

GV*  gv_fetchmeth_autoload(HV* stash, const char* name,
                           STRLEN len, I32 level)
gv_fetchmeth_pv

Точно так же, как "gv_fetchmeth_pvn", но принимает строку с нулевым завершением вместо пары "строка/длина".

GV*  gv_fetchmeth_pv(HV* stash, const char* name, I32 level,
                     U32 flags)
gv_fetchmeth_pvn

Возвращает типглоб с заданным name и определённой подпрограммой или NULL. Типглоб находится в заданном stash, или в стеках, доступных через @ISA и UNIVERSAL::.

Аргумент level должен быть либо 0, либо -1. Если level==0, как побочный эффект, создаёт типглоб с заданным name в заданном stash, который в случае успеха содержит псевдоним для подпрограммы, и настраивает кеширование для этого типаглоба.

Единственные существенные значения для flags — GV_SUPER, GV_NOUNIVERSAL, и SVf_UTF8.

GV_SUPER указывает, что мы хотим найти метод в суперклассах stash.

GV_NOUNIVERSAL указывает, что мы не хотим искать метод в стеке, доступном через UNIVERSAL::.

Возвращаемый GV из gv_fetchmeth может быть элементом кэша метода, который не виден коду Perl. Поэтому при вызове call_sv, не следует использовать GV напрямую; вместо этого следует использовать CV метода, который можно получить из GV с помощью макроса GvCV.

GV*  gv_fetchmeth_pvn(HV* stash, const char* name, STRLEN len,
                      I32 level, U32 flags)
gv_fetchmeth_pvn_autoload

То же самое, что и gv_fetchmeth_pvn(), но также ищет автозагружаемые подпрограммы. Возвращает глоб для подпрограммы.

Для автозагружаемой подпрограммы без GV, создаст GV, даже если level < 0. Для автозагружаемой подпрограммы без заглушки, GvCV() результата может быть равно нулю.

В настоящее время единственное значимое значение для flags равно SVf_UTF8.

GV*  gv_fetchmeth_pvn_autoload(HV* stash, const char* name,
                               STRLEN len, I32 level, U32 flags)
gv_fetchmeth_pv_autoload

Точно так же, как "gv_fetchmeth_pvn_autoload", но принимает строку с нулевым завершением вместо пары "строка/длина".

GV*  gv_fetchmeth_pv_autoload(HV* stash, const char* name,
                              I32 level, U32 flags)
gv_fetchmeth_sv

Точно так же, как "gv_fetchmeth_pvn", но принимает строку имени в виде SV вместо пары "строка/длина".

GV*  gv_fetchmeth_sv(HV* stash, SV* namesv, I32 level, U32 flags)
gv_fetchmeth_sv_autoload

Точно так же, как "gv_fetchmeth_pvn_autoload", но принимает строку имени в виде SV вместо пары "строка/длина".

GV*  gv_fetchmeth_sv_autoload(HV* stash, SV* namesv, I32 level,
                              U32 flags)
gv_fetchpv
gv_fetchpvn
gv_fetchpvn_flags
gv_fetchpvs
gv_fetchsv
gv_fetchsv_nomg

Все они возвращают GV типа sv_type, имя которого задано входными данными, или NULL, если GV с таким именем и типом не найдено. См. "Стейши и глобы" в perlguts.

Единственные различия заключаются в том, как задаётся входное имя и используется ли "магия получения" при получении этого имени.

Не позволяйте обмануть тот факт, что только одна форма имеет flags в своём имени. На самом деле все они имеют параметр flags, и все биты флагов имеют одинаковое значение для всех.

Если какой-либо из флагов GV_ADD, GV_ADDMG, GV_ADDWARN, GV_ADDMULTI, или GV_NOINIT установлен, GV создаётся, если он ещё не существует для указанного входного имени и типа. Однако, GV_ADDMG будет выполнять создание только для магических GV. Для всех этих флагов, кроме GV_NOINIT, "gv_init_pvn" вызывается после добавления. GV_ADDWARN используется, когда вызывающий код ожидает, что добавление не потребуется, так как символ уже должен существовать; но если нет, добавить его всё равно, выдав предупреждение о его неожиданном отсутствии. Флаг GV_ADDMULTI означает, что нужно сделать вид, что GV уже был виден ранее (т.е., подавить предупреждения "Используется один раз").

Флаг GV_NOADD_NOINIT приводит к тому, что "gv_init_pvn" не вызывается, если GV существовал, но не является PVGV.

Если бит SVf_UTF8 установлен, имя обрабатывается как закодированное в UTF-8; в противном случае имя не будет рассматриваться как UTF-8 в формах с именем pv, а UTF-8-ность базовых SV будет использоваться в формах sv.

Если установлен флаг GV_NOTQUAL, вызывающий код гарантирует, что входное имя — это просто имя символа, а не имя, квалифицированное пакетом; в противном случае имя проверяется на квалификацию.

В gv_fetchpv, nambeg — это строка C, завершённая нулём без промежуточных нулей.

В gv_fetchpvs, name — это литерная строка C, поэтому заключена в двойные кавычки.

gv_fetchpvn и gv_fetchpvn_flags идентичны. В них <nambeg> — это строка Perl, длина байтов которой задаётся full_len, и она может содержать вложенные нули.

В gv_fetchsv и gv_fetchsv_nomg, имя извлекается из PV входного name SV. Единственное различие между этими двумя формами состоит в том, что "магия получения" обычно применяется к name в gv_fetchsv, и всегда пропускается в gv_fetchsv_nomg. Включение GV_NO_SVGMAGIC в параметр flags для gv_fetchsv делает его идентичным gv_fetchsv_nomg.

GV*   gv_fetchpv       (const char *nambeg, I32 flags,
                        const svtype sv_type)
GV *  gv_fetchpvn      (const char * nambeg, STRLEN full_len,
                        I32 flags, const svtype sv_type)
GV*   gv_fetchpvn_flags(const char* name, STRLEN len, I32 flags,
                        const svtype sv_type)
GV *  gv_fetchpvs      ("name", I32 flags, const svtype sv_type)
GV*   gv_fetchsv       (SV *name, I32 flags, const svtype sv_type)
GV *  gv_fetchsv_nomg  (SV *name, I32 flags, const svtype sv_type)
gv_fullname3
gv_fullname4
gv_efullname3
gv_efullname4

Поместите полное имя пакета gv в sv. Формы gv_e* вместо этого возвращают эффективное имя пакета (см. "HvENAME").

Если prefix не равно NULL, оно рассматривается как строка C, завершённая нулём, и хранимое имя будет предваряться ей.

Другое отличие между функциями заключается в том, что формы *4 имеют дополнительный параметр keepmain. Если true, начальное main:: в имени сохраняется; если false, оно удаляется. В формах *3 оно всегда сохраняется.

void  gv_fullname3 (SV* sv, const GV* gv, const char* prefix)
void  gv_fullname4 (SV* sv, const GV* gv, const char* prefix,
                    bool keepmain)
void  gv_efullname3(SV* sv, const GV* gv, const char* prefix)
void  gv_efullname4(SV* sv, const GV* gv, const char* prefix,
                    bool keepmain)
GvHV

Возвращает HV из GV.

HV*  GvHV(GV* gv)
gv_init

Старая форма gv_init_pvn(). Она не работает со строками UTF-8, так как не имеет параметра флагов. Если параметр multi установлен, флаг GV_ADDMULTI будет передан в gv_init_pvn().

void  gv_init(GV* gv, HV* stash, const char* name, STRLEN len,
              int multi)
gv_init_pv

То же самое, что и gv_init_pvn(), но принимает строку с нулевым завершением для имени вместо отдельных параметров char * и длина.

void  gv_init_pv(GV* gv, HV* stash, const char* name, U32 flags)
gv_init_pvn

Преобразует скаляр в типглоб. Это непереводимый типглоб; присваивание ссылки на него присвоит значение одному из его слотов, а не перепишет его, как это происходит с типглобами, созданными SvSetSV. Преобразование любого скаляра, который SvOK() может привести к непредсказуемым результатам и предназначено для внутреннего использования Perl.

gv — это скаляр, который необходимо преобразовать.

stash — это родительский стеш/пакет, если таковой имеется.

name и len задают имя. Имя должно быть неквалифицированным, то есть не должно включать имя пакета. Если gv — элемент стеша, ответственность вызывающего кода заключается в обеспечении того, чтобы имя, переданное этой функции, соответствовало имени элемента. Если это не так, внутренняя учётная запись Perl выйдет из строя.

flags может быть установлено в SVf_UTF8, если name — строка UTF-8, или значением возвращаемым SvUTF8(sv). Он также может принять флаг GV_ADDMULTI, который означает, что нужно сделать вид, что GV уже был виден ранее (т.е., подавить предупреждения "Используется один раз").

void  gv_init_pvn(GV* gv, HV* stash, const char* name, STRLEN len,
                  U32 flags)
gv_init_sv

То же самое, что и gv_init_pvn(), но принимает SV * для имени вместо отдельных параметров char * и длина. flags в настоящее время не используется.

void  gv_init_sv(GV* gv, HV* stash, SV* namesv, U32 flags)
gv_stashpv

Возвращает указатель на стеш для указанного пакета. Использует strlen для определения длины name, а затем вызывает gv_stashpvn().

HV*  gv_stashpv(const char* name, I32 flags)
gv_stashpvn

Возвращает указатель на стеш для указанного пакета. Параметр namelen указывает длину name, в байтах. flags передаётся в gv_fetchpvn_flags(), поэтому, если он установлен в GV_ADD, пакет будет создан, если он ещё не существует. Если пакет не существует и flags равно 0 (или любое другое значение, не создающее пакеты), возвращается NULL.

Флаги могут быть следующими:

GV_ADD           Create and initialize the package if doesn't
                 already exist
GV_NOADD_NOINIT  Don't create the package,
GV_ADDMG         GV_ADD iff the GV is magical
GV_NOINIT        GV_ADD, but don't initialize
GV_NOEXPAND      Don't expand SvOK() entries to PVGV
SVf_UTF8         The name is in UTF-8

Из которых, вероятно, наиболее важны GV_ADD и SVf_UTF8.

Обратите внимание, что использование gv_stashsv вместо gv_stashpvn по возможности настоятельно рекомендуется по соображениям производительности.

HV*  gv_stashpvn(const char* name, U32 namelen, I32 flags)
gv_stashpvs

Как gv_stashpvn, но принимает литерную строку вместо пары "строка/длина".

HV*  gv_stashpvs("name", I32 create)
gv_stashsv

Возвращает указатель на стеш для указанного пакета. См. "gv_stashpvn".

Обратите внимание, что этот интерфейс сильно предпочтительнее gv_stashpvn по соображениям производительности.

HV*  gv_stashsv(SV* sv, I32 flags)
GvSV

Возвращает SV из GV.

До Perl v5.9.3 это добавит скаляр, если он не существует. В наши дни используйте "GvSVn" для этого или скомпилируйте Perl с -DPERL_CREATE_GVSV. См. perl5100delta.

SV*  GvSV(GV* gv)
GvSVn

Как "GvSV", но создаёт пустой скаляр, если он ещё не существует.

SV*  GvSVn(GV* gv)
newGVgen
newGVgen_flags

Создаёт новый, гарантированно уникальный, GV в пакете, заданном строкой C с нулевым завершением pack, и возвращает указатель на него.

Для newGVgen или если flags в newGVgen_flags равно 0, pack следует рассматривать как закодированное в Latin-1. Единственное другое допустимое значение flags — это SVf_UTF8, которое указывает, что pack следует рассматривать как закодированное в UTF-8.

GV*  newGVgen      (const char* pack)
GV*  newGVgen_flags(const char* pack, U32 flags)
PL_curstash

Стеш для пакета, в который будет скомпилирован код.

В многопоточных Perl-ях у каждой нити есть независимая копия этой переменной; каждая инициализируется во время создания текущим значением копии нити-создателя.

HV*  PL_curstash
PL_defgv

GV, представляющий *_. Полезно для доступа к $_.

В многопоточных Perl-ях у каждой нити есть независимая копия этой переменной; каждая инициализируется во время создания текущим значением копии нити-создателя.

GV *  PL_defgv
PL_defstash

Описано в perlguts.

save_gp

Сохраняет текущий GP gv в стеке сохранения для восстановления при выходе из области видимости.

Если empty истинно, замените GP новым GP.

Если empty ложно, пометьте gv флагом GVf_INTRO, чтобы следующая присвоенная ссылка была локализована, что позволяет работать local *foo = $someref; .

void  save_gp(GV* gv, I32 empty)
setdefout

Устанавливает PL_defoutgv, стандартный дескриптор файла для вывода, на переданный типглоб. Так как PL_defoutgv "владеет" ссылкой на свой типглоб, счётчик ссылок переданного типглоба увеличивается на единицу, а счётчик ссылок типглоба, на который указывает PL_defoutgv, уменьшается на единицу.

void  setdefout(GV* gv)

Манипуляции с хуками

Эти функции предоставляют удобный и потокобезопасный способ манипулирования переменными хуков.

wrap_op_checker

Добавляет C-функцию в цепочку проверочных функций для указанного типа операции. Это предпочтительный способ манипулирования массивом «PL_check». opcode определяет тип операции, на которую повлияет функция. new_checker — указатель на C-функцию, которая должна быть добавлена в цепочку проверок для данного кода операции, а old_checker_p указывает на место хранения указателя на следующую функцию в цепочке. Значение new_checker записывается в массив «PL_check», а ранее сохраненное значение записывается в *old_checker_p.

«PL_check» является глобальным для всего процесса, и модуль, желающий подключить проверку операций, может быть вызван более одного раза в процессе, обычно в разных потоках. Для обработки этой ситуации функция является идемпотентной. Место *old_checker_p должно первоначально (один раз на процесс) содержать нулевой указатель. C-переменная со статическим сроком действия (объявленная на уровне файла, обычно также помеченная static для предоставления внутренней связи) будет неявно инициализирована должным образом, если она не имеет явного инициализатора. Эта функция фактически изменит цепочку проверок только в том случае, если найдет *old_checker_p равным нулевому указателю. Функция также потокобезопасна в малом масштабе. Она использует соответствующие блокировки, чтобы избежать гонок при доступе к «PL_check».

При вызове этой функции функция, на которую ссылается new_checker, должна быть готова к вызову, за исключением того, что *old_checker_p не заполнен. В ситуации с многопоточностью new_checker может быть вызван немедленно, даже до возврата этой функции. *old_checker_p всегда будет должным образом установлено до вызова new_checker. Если new_checker решит не делать ничего особенного с операцией, которую получает (что обычно и происходит для большинства случаев использования подключений к проверке операций), то она должна передать проверочную функцию, на которую ссылается *old_checker_p.

В целом, XS-код для подключения проверочной функции для операций обычно выглядит так:

static Perl_check_t nxck_frob;
static OP *myck_frob(pTHX_ OP *op) {
    ...
    op = nxck_frob(aTHX_ op);
    ...
    return op;
}
BOOT:
    wrap_op_checker(OP_FROB, myck_frob, &nxck_frob);

Если вы хотите повлиять на компиляцию вызовов определенной подпрограммы, то используйте «cv_set_call_checker_flags» вместо подключения проверки всех entersub операций.

void  wrap_op_checker(Optype opcode, Perl_check_t new_checker,
                      Perl_check_t *old_checker_p)

Обработка HV

Структура HV представляет собой перловский массив. Она состоит в основном из массива указателей, каждый из которых указывает на связанный список структур HE. Массив индексируется по функции хэширования ключа, поэтому каждый связанный список представляет все записи хеша с одинаковым значением хэша. Каждый HE содержит указатель на фактическое значение плюс указатель на структуру HEK, которая содержит ключ и значение хэша.

get_hv

Возвращает HV для указанного перловского массива. flags передаются в gv_fetchpv. Если GV_ADD установлено, и перловая переменная не существует, она будет создана. Если flags равно нулю, и переменная не существует, то возвращается NULL.

ПРИМЕЧАНИЕ: форма perl_get_hv() устарела.

HV*  get_hv(const char *name, I32 flags)
HE

Описано в perlguts.

HEf_SVKEY

Этот флаг, используемый в слоте длины записей хеша и магических структур, указывает, что структура содержит указатель SV*, где ожидается указатель char*. (Для справки — не для использования).

HeHASH

Возвращает вычисленное значение хэша, хранящееся в записи хеша.

U32  HeHASH(HE* he)
HeKEY

Возвращает фактический указатель, хранящийся в слоте ключа записи хеша. Указатель может быть либо char*, либо SV*, в зависимости от значения HeKLEN(). Может быть присвоено. Макросы HePV() или HeSVKEY() обычно предпочтительнее для поиска значения ключа.

void*  HeKEY(HE* he)
HeKLEN

Если это отрицательное значение, и оно равно HEf_SVKEY, это указывает, что запись содержит ключ SV*. В противном случае содержит фактическую длину ключа. Может быть присвоено. Макрос HePV() обычно предпочтительнее для поиска длины ключа.

STRLEN  HeKLEN(HE* he)
HePV

Возвращает слот ключа записи хеша как значение char*, выполняя все необходимые разыменования, возможно, SV* ключей. Длина строки помещается в len (это макрос, поэтому не используйте &len). Если вам неважна длина ключа, вы можете использовать глобальную переменную PL_na, хотя это немного менее эффективно, чем использование локальной переменной. Однако помните, что ключи хеша в Perl могут содержать вложенные нули, поэтому использование strlen() или подобного не является хорошим способом определения длины ключей хеша. Это очень похоже на макрос SvPV(), описанный в другом месте этого документа. См. также "HeUTF8".

Если вы используете HePV для получения значений, которые нужно передать в newSVpvn() для создания нового SV, вы можете рассмотреть использование newSVhek(HeKEY_hek(he)), так как оно более эффективно.

char*  HePV(HE* he, STRLEN len)
HeSVKEY

Возвращает ключ как SV*, или NULL, если запись хеша не содержит ключ SV*.

SV*  HeSVKEY(HE* he)
HeSVKEY_force

Возвращает ключ как SV*. Создаст и вернет временную смертную SV*, если запись хеша содержит только ключ char*.

SV*  HeSVKEY_force(HE* he)
HeSVKEY_set

Устанавливает ключ на заданное SV*, заботясь об установке соответствующих флагов для указания наличия ключа SV*, и возвращает тот же SV*.

SV*  HeSVKEY_set(HE* he, SV* sv)
HeUTF8

Возвращает, закодировано ли значение char *, возвращаемое HePV, в UTF-8, выполняя все необходимые разыменования, возможно, SV* ключей. Возвращаемое значение будет 0 или ненулевое, но не обязательно 1 (или даже значение с установленными младшими битами), поэтому не следует слепо присваивать его переменной bool, так как bool может быть typedef для char.

U32  HeUTF8(HE* he)
HeVAL

Возвращает слот значения (тип SV*), хранящийся в записи хеша. Может быть присвоено.

SV *foo= HeVAL(hv);
HeVAL(hv)= sv;
SV*  HeVAL(HE* he)
HV

Описано в perlguts.

hv_assert

Проверяет, находится ли хеш в внутренне согласованном состоянии.

ПРИМЕЧАНИЕ: hv_assert необходимо вызывать явно как Perl_hv_assert с параметром aTHX_.

void  Perl_hv_assert(pTHX_ HV *hv)
hv_bucket_ratio

ПРИМЕЧАНИЕ: hv_bucket_ratio является экспериментальным и может быть изменен или удален без предварительного уведомления.

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

Эта функция дорогостоящая, она должна просканировать все ведра, чтобы определить, какие из них используются, и счет не кешируется. В большом массиве это может быть много ведер.

SV*  hv_bucket_ratio(HV *hv)
hv_clear

Освобождает все элементы массива, оставляя его пустым. XS-эквивалент %hash = (). См. также «hv_undef».

См. «av_clear» для примечания о том, что хеш, возможно, будет недействительным по возвращении.

void  hv_clear(HV *hv)
hv_clear_placeholders

Очищает все заполнительные ключи из хеша. Если ограниченный массив имеет ключи, помеченные как только для чтения, а ключ впоследствии удаляется, ключ фактически не удаляется, а помечается присвоением ему значения &PL_sv_placeholder. Это помечает его так, что он будет игнорироваться в будущих операциях, таких как итерация по массиву, но все еще позволит массиву повторно назначить значение ключу в какой-то момент в будущем. Эта функция очищает все такие заполнительные ключи из хеша. См. Hash::Util::lock_keys() для примера его использования.

void  hv_clear_placeholders(HV *hv)
hv_copy_hints_hv

Специализированная версия «newHVhv» для копирования %^H. ohv должен быть указателем на хеш (который может иметь магию %^H, но должен быть в основном без магии) или NULL (интерпретируется как пустой массив). Содержимое ohv копируется в новый хеш, которому добавляется магия, специфичная для %^H. Возвращается указатель на новый хеш.

HV *  hv_copy_hints_hv(HV *const ohv)
hv_delete

Удаляет пару ключ/значение в массиве. SV значения удаляется из массива, делается смертным и возвращается вызывающей стороне. Абсолютное значение klen — длина ключа. Если klen отрицательно, предполагается, что ключ закодирован в UTF-8-Unicode. Значение flags обычно равно нулю; если установлено в G_DISCARD, то возвращается NULL. NULL также будет возвращено, если ключ не найден.

SV*  hv_delete(HV *hv, const char *key, I32 klen, I32 flags)
hv_delete_ent

Удаляет пару ключ/значение в массиве. SV значения удаляется из массива, делается смертным и возвращается вызывающей стороне. Значение flags обычно равно нулю; если установлено в G_DISCARD, то возвращается NULL. NULL также будет возвращено, если ключ не найден. hash может быть допустимым предварительно вычисленным значением хэша или 0, чтобы запросить его вычисление.

SV*  hv_delete_ent(HV *hv, SV *keysv, I32 flags, U32 hash)
HvENAME

Возвращает эффективное имя хранилища или NULL, если его нет. Эффективное имя представляет собой местоположение в таблице символов, где находится хранилище. Оно обновляется автоматически при алиасировании или удалении пакетов. Хранилище, которое больше не находится в таблице символов, не имеет эффективного имени. Это имя предпочтительнее HvNAME для использования в линейных иерархиях MRO и кэшах isa.

char*  HvENAME(HV* stash)
HvENAMELEN

Возвращает длину эффективного имени хранилища.

STRLEN  HvENAMELEN(HV *stash)
HvENAMEUTF8

Возвращает true, если эффективное имя закодировано в UTF-8.

unsigned char  HvENAMEUTF8(HV *stash)
hv_exists

Возвращает булево значение, указывающее, существует ли указанный хэш-ключ. Абсолютное значение klen равно длине ключа. Если klen отрицательное, ключ предполагается закодированным в UTF-8.

bool  hv_exists(HV *hv, const char *key, I32 klen)
hv_exists_ent

Возвращает булево значение, указывающее, существует ли указанный хэш-ключ. hash может быть допустимым предварительно вычисленным хэш-значением или 0, чтобы запросить его вычисление.

bool  hv_exists_ent(HV *hv, SV *keysv, U32 hash)
hv_fetch

Возвращает SV, соответствующий указанному ключу в хэше. Абсолютное значение klen равно длине ключа. Если klen отрицательное, ключ предполагается закодированным в UTF-8. Если lval установлено, извлечение будет частью сохранения. Это означает, что если в хэше нет значения, связанного с данным ключом, то создаётся одно, и возвращается указатель на него. На SV* можно назначить значение. Но всегда проверяйте, что возвращаемое значение не null, прежде чем обращаться к нему как к SV*.

См. "Understanding the Magic of Tied Hashes and Arrays" в perlguts для получения дополнительной информации об использовании этой функции с привязанными хэшами.

SV**  hv_fetch(HV *hv, const char *key, I32 klen, I32 lval)
hv_fetchs

Подобно hv_fetch, но принимает строку-литерал вместо пары строка/длина.

SV**  hv_fetchs(HV* tb, "key", I32 lval)
hv_fetch_ent

Возвращает запись хэша, соответствующую заданному ключу в хэше. hash должен быть допустимым предварительно вычисленным числовым значением хэша для данного key, или 0, если вы хотите, чтобы функция его вычислила. Если lval установлено, извлечение будет частью сохранения. Убедитесь, что возвращаемое значение не null, прежде чем обращаться к нему. Возвращаемое значение, когда hv — привязанный хэш, — указатель на статическую локацию, поэтому обязательно сделайте копию структуры, если вам нужно её где-то сохранить.

См. "Understanding the Magic of Tied Hashes and Arrays" в perlguts для получения дополнительной информации об использовании этой функции с привязанными хэшами.

HE*  hv_fetch_ent(HV *hv, SV *keysv, I32 lval, U32 hash)
HvFILL

Возвращает количество используемых хэш-корзин.

Начиная с perl 5.25, эта функция используется только в отладочных целях, и количество используемых хэш-корзин никак не кешируется, поэтому выполнение этой функции может быть дорогостоящим, так как она должна перебирать все корзины в хэше.

STRLEN  HvFILL(HV *const hv)
hv_iterinit

Подготавливает начальную точку для обхода таблицы хэша. Возвращает количество ключей в хэше, включая заполнители (т. е. такое же, как HvTOTALKEYS(hv)). Возвращаемое значение в настоящее время имеет смысл только для хэшей без привязки.

ПРИМЕЧАНИЕ: До версии 5.004_65, hv_iterinit возвращало количество используемых хэш-корзин. Если вам всё ещё нужно это экзотическое значение, вы можете получить его через макрос HvFILL(hv).

I32  hv_iterinit(HV *hv)
hv_iterkey

Возвращает ключ из текущей позиции итератора хэша. См. "hv_iterinit".

char*  hv_iterkey(HE* entry, I32* retlen)
hv_iterkeysv

Возвращает ключ как SV* из текущей позиции итератора хэша. Возвращаемое значение всегда является смертной копией ключа. Также см. "hv_iterinit".

SV*  hv_iterkeysv(HE* entry)
hv_iternext

Возвращает записи из итератора хэша. См. "hv_iterinit".

Вы можете вызвать hv_delete или hv_delete_ent для записи хэша, на которую в данный момент указывает итератор, без потери позиции или инвалидации итератора. Обратите внимание, что в этом случае текущая запись удаляется из хэша, и ваш итератор держит последнюю ссылку на неё. Ваш итератор помечен на освобождение записи при следующем вызове hv_iternext, поэтому вы не должны сразу отбрасывать свой итератор, иначе запись будет утечкой — вызовите hv_iternext, чтобы инициировать освобождение ресурсов.

HE*  hv_iternext(HV *hv)
hv_iternextsv

Выполняет hv_iternext, hv_iterkey, и hv_iterval в одной операции.

SV*  hv_iternextsv(HV *hv, char **key, I32 *retlen)
hv_iternext_flags

ПРИМЕЧАНИЕ: hv_iternext_flags — экспериментальная функция и может быть изменена или удалена без предварительного уведомления.

Возвращает записи из итератора хэша. См. "hv_iterinit" и "hv_iternext". Значение flags обычно равно нулю; если HV_ITERNEXT_WANTPLACEHOLDERS установлено, будут возвращены ключи-заполнители (для ограниченных хэшей) в дополнение к обычным ключам. По умолчанию заполнители автоматически пропускаются. В настоящее время заполнитель реализован с помощью значения, которое &PL_sv_placeholder. Обратите внимание, что реализация заполнителей и ограниченных хэшей может измениться, и текущая реализация недостаточно абстрагирована для того, чтобы любое изменение было аккуратным.

HE*  hv_iternext_flags(HV *hv, I32 flags)
hv_iterval

Возвращает значение из текущей позиции итератора хэша. См. "hv_iterkey".

SV*  hv_iterval(HV *hv, HE *entry)
hv_magic

Добавляет магию к хэшу. См. "sv_magic".

void  hv_magic(HV *hv, GV *gv, int how)
HvNAME

Возвращает имя пакета хранилища или NULL если stash не является хранилищем. См. "SvSTASH", "CvSTASH".

char*  HvNAME(HV* stash)
HvNAMELEN

Возвращает длину имени хранилища.

Нежелательные формы HvNAME и HvNAMELEN; подавить их упоминание

STRLEN  HvNAMELEN(HV *stash)
HvNAMEUTF8

Возвращает true, если имя закодировано в UTF-8.

unsigned char  HvNAMEUTF8(HV *stash)
hv_scalar

Вычисляет хэш в скалярном контексте и возвращает результат.

При привязанном хэше передаётся в метод SCALAR, иначе возвращает смертельный SV, содержащий количество ключей в хэше.

Обратите внимание, что до версии 5.25 эта функция возвращала то, что сейчас возвращает функция hv_bucket_ratio().

SV*  hv_scalar(HV *hv)
hv_store

Сохраняет SV в хэше. Ключ хэша задаётся как key, абсолютное значение klen — длина ключа. Если klen отрицательное, ключ предполагается закодированным в UTF-8. Параметр hash — предварительно вычисленное хэш-значение; если оно равно нулю, Perl его вычислит.

Возвращаемое значение будет NULL если операция не удалась или значение не нужно было фактически хранить в хэше (как в случае привязанных хэшей). В противном случае можно обратиться к нему, чтобы получить исходный SV*. Обратите внимание, что вызывающая сторона отвечает за надлежащее увеличение счётчика ссылок для val перед вызовом и уменьшение его, если функция вернула NULL. Фактически успешная hv_store принимает владение одной ссылкой на val. Это обычно то, что вы хотите; у только что созданного SV счётчик ссылок равен 1, поэтому, если весь ваш код лишь создаёт SV и сохраняет их в хэш, hv_store будет владеть единственной ссылкой на новый SV, и вашему коду не нужно будет ничего больше делать, чтобы всё убрать. hv_store не реализован как вызов hv_store_ent, и не создаёт временного SV для ключа, поэтому если данные вашего ключа не в форме SV, используйте hv_store вместо hv_store_ent.

См. "Understanding the Magic of Tied Hashes and Arrays" в perlguts для получения дополнительной информации об использовании этой функции с привязанными хэшами.

SV**  hv_store(HV *hv, const char *key, I32 klen, SV *val,
               U32 hash)
hv_stores

Подобно hv_store, но принимает строку-литерал вместо пары строка/длина и пропускает параметр хэша.

SV**  hv_stores(HV* tb, "key", SV* val)
hv_store_ent

Сохраняет val в хэше. Ключ хэша задаётся как key. Параметр hash — предварительно вычисленное хэш-значение; если оно равно нулю, Perl его вычислит. Возвращаемое значение — созданная новая запись хэша. Оно будет NULL если операция не удалась или значение не нужно было фактически хранить в хэше (как в случае привязанных хэшей). В противном случае содержимое возвращаемого значения можно получить с помощью макросов He?, описанных здесь. Обратите внимание, что вызывающая сторона отвечает за надлежащее увеличение счётчика ссылок для val перед вызовом и уменьшение его, если функция вернула NULL. Фактически успешная hv_store_ent принимает владение одной ссылкой на val. Это обычно то, что вы хотите; у только что созданного SV счётчик ссылок равен 1, поэтому, если весь ваш код лишь создаёт SV и сохраняет их в хэш, hv_store будет владеть единственной ссылкой на новый SV, и вашему коду не нужно будет ничего больше делать, чтобы всё убрать. Обратите внимание, что hv_store_ent только считывает key; в отличие от val, он не принимает владение им, поэтому поддержание правильного счётчика ссылок для key целиком лежит на ответственности вызывающей стороны. Причина, по которой он не принимает владения, заключается в том, что key не используется после возврата этой функции и поэтому может быть освобождён немедленно. hv_store не реализован как вызов hv_store_ent, и не создаёт временный SV для ключа, поэтому если данные вашего ключа не в форме SV, используйте hv_store вместо hv_store_ent.

См. "Understanding the Magic of Tied Hashes and Arrays" в perlguts для получения дополнительной информации об использовании этой функции с привязанными хэшами.

HE*  hv_store_ent(HV *hv, SV *key, SV *val, U32 hash)
hv_undef

Удаляет хэш. Эквивалент XS undef(%hash).

Помимо освобождения всех элементов хэша (как hv_clear() это также освобождает все вспомогательные данные и хранилище, связанные с хэшем.

См. "av_clear" для примечания о том, что хэш может быть недопустимым при возврате.

void  hv_undef(HV *hv)
newHV

Создаёт новый HV. Счётчик ссылок установлен в 1.

HV*  newHV()
newHVhv

Содержимое ohv копируется в новый хэш. Возвращается указатель на новый хэш.

HV*  newHVhv(HV *hv)
Nullhv

DEPRECATED! Планируется удалить Nullhv в будущих выпусках Perl. Не используйте его в новом коде; удалите его из существующего кода.

Указатель на нулевой HV.

(устарело — используйте (HV *)NULL вместо этого)

END_OF_DOCUMENT_MARKER
PERL_HASH

Описано в perlguts.

void  PERL_HASH(U32 hash, char *key, STRLEN klen)
PL_modglobal

PL_modglobal — это глобальная интерпретаторская переменная общего назначения, используемая расширениями, которым нужно хранить информацию на основе каждой интерпретации. В случае необходимости, она также может использоваться как таблица символов для расширений, чтобы обмениваться данными друг с другом. Рекомендуется использовать ключи, начинающиеся с имени пакета расширения, которому принадлежат данные.

В многопоточных Perl-интерпретаторах каждый поток имеет независимую копию этой переменной; каждая инициализируется при создании текущим значением копии создающего потока.

HV*  PL_modglobal

Ввод/Вывод

IoDIRP

Описано в perlguts.

DIR *  IoDIRP(IO *io)
IOf_FLUSH

Описано в perlguts.

IoFLAGS

Описано в perlguts.

U8  IoFLAGS(IO *io)
IOf_UNTAINT

Описано в perlguts.

IoIFP

Описано в perlguts.

PerlIO *  IoIFP(IO *io)
IoOFP

Описано в perlguts.

PerlIO *  IoOFP(IO *io)
IoTYPE

Описано в perlguts.

char  IoTYPE(IO *io)
my_chsize

Библиотечная функция C chsize(3), если доступна, или её Perl-реализация.

I32  my_chsize(int fd, Off_t length)
my_dirfd

Библиотечная функция C dirfd(3), если доступна, или её Perl-реализация, или ошибка, если нет простого способа эмуляции.

int  my_dirfd(DIR* dir)
my_pclose

Обёртка для библиотечной функции C pclose(3). Не используйте последнюю, так как Perl-версия знает вещи, которые взаимодействуют с остальной частью интерпретатора Perl.

I32  my_pclose(PerlIO* ptr)
my_popen

Обёртка для библиотечной функции C popen(3). Не используйте последнюю, так как Perl-версия знает вещи, которые взаимодействуют с остальной частью интерпретатора Perl.

PerlIO*  my_popen(const char* cmd, const char* mode)
newIO

Создать новый IO, установив счётчик ссылок на 1.

IO*  newIO()
PERL_FLUSHALL_FOR_CHILD

Определяет способ очистки всех буферов вывода. Это может быть проблемой производительности, поэтому мы позволяем людям её отключить. Кроме того, если мы используем stdio, есть сломанные реализации fflush(NULL) там, Solaris является самым ярким примером.

void  PERL_FLUSHALL_FOR_CHILD
PerlIO_apply_layers
PerlIO_binmode
PerlIO_canset_cnt
PerlIO_clearerr
PerlIO_close
PerlIO_debug
PerlIO_eof
PerlIO_error
PerlIO_exportFILE
PerlIO_fast_gets
PerlIO_fdopen
PerlIO_fileno
PerlIO_fill
PerlIO_findFILE
PerlIO_flush
PerlIO_get_base
PerlIO_get_bufsiz
PerlIO_getc
PerlIO_get_cnt
PerlIO_getpos
PerlIO_get_ptr
PerlIO_has_base
PerlIO_has_cntptr
PerlIO_importFILE
PerlIO_open
PerlIO_printf
PerlIO_putc
PerlIO_puts
PerlIO_read
PerlIO_releaseFILE
PerlIO_reopen
PerlIO_rewind
PerlIO_seek
PerlIO_set_cnt
PerlIO_setlinebuf
PerlIO_setpos
PerlIO_set_ptrcnt
PerlIO_stderr
PerlIO_stdin
PerlIO_stdout
PerlIO_stdoutf
PerlIO_tell
PerlIO_ungetc
PerlIO_unread
PerlIO_vprintf
PerlIO_write

Описано в perlapio.

int        PerlIO_apply_layers(PerlIO *f, const char *mode,
                               const char *layers)
int        PerlIO_binmode     (PerlIO *f, int ptype, int imode,
                               const char *layers)
int        PerlIO_canset_cnt  (PerlIO *f)
void       PerlIO_clearerr    (PerlIO *f)
int        PerlIO_close       (PerlIO *f)
void       PerlIO_debug       (const char *fmt, ...)
int        PerlIO_eof         (PerlIO *f)
int        PerlIO_error       (PerlIO *f)
FILE *     PerlIO_exportFILE  (PerlIO *f, const char *mode)
int        PerlIO_fast_gets   (PerlIO *f)
PerlIO *   PerlIO_fdopen      (int fd, const char *mode)
int        PerlIO_fileno      (PerlIO *f)
int        PerlIO_fill        (PerlIO *f)
FILE *     PerlIO_findFILE    (PerlIO *f)
int        PerlIO_flush       (PerlIO *f)
STDCHAR *  PerlIO_get_base    (PerlIO *f)
SSize_t    PerlIO_get_bufsiz  (PerlIO *f)
int        PerlIO_getc        (PerlIO *d)
SSize_t    PerlIO_get_cnt     (PerlIO *f)
int        PerlIO_getpos      (PerlIO *f, SV *save)
STDCHAR *  PerlIO_get_ptr     (PerlIO *f)
int        PerlIO_has_base    (PerlIO *f)
int        PerlIO_has_cntptr  (PerlIO *f)
PerlIO *   PerlIO_importFILE  (FILE *stdio, const char *mode)
PerlIO *   PerlIO_open        (const char *path, const char *mode)
int        PerlIO_printf      (PerlIO *f, const char *fmt, ...)
int        PerlIO_putc        (PerlIO *f, int ch)
int        PerlIO_puts        (PerlIO *f, const char *string)
SSize_t    PerlIO_read        (PerlIO *f, void *vbuf,
                               Size_t count)
void       PerlIO_releaseFILE (PerlIO *f, FILE *stdio)
PerlIO *   PerlIO_reopen      (const char *path, const char *mode,
                               PerlIO *old)
void       PerlIO_rewind      (PerlIO *f)
int        PerlIO_seek        (PerlIO *f, Off_t offset,
                               int whence)
void       PerlIO_set_cnt     (PerlIO *f, SSize_t cnt)
void       PerlIO_setlinebuf  (PerlIO *f)
int        PerlIO_setpos      (PerlIO *f, SV *saved)
void       PerlIO_set_ptrcnt  (PerlIO *f, STDCHAR *ptr,
                               SSize_t cnt)
PerlIO *   PerlIO_stderr      (PerlIO *f, const char *mode,
                               const char *layers)
PerlIO *   PerlIO_stdin       (PerlIO *f, const char *mode,
                               const char *layers)
PerlIO *   PerlIO_stdout      (PerlIO *f, const char *mode,
                               const char *layers)
int        PerlIO_stdoutf     (const char *fmt, ...)
Off_t      PerlIO_tell        (PerlIO *f)
int        PerlIO_ungetc      (PerlIO *f, int ch)
SSize_t    PerlIO_unread      (PerlIO *f, const void *vbuf,
                               Size_t count)
int        PerlIO_vprintf     (PerlIO *f, const char *fmt,
                               va_list args)
SSize_t    PerlIO_write       (PerlIO *f, const void *vbuf,
                               Size_t count)
PERLIO_FUNCS_CAST

Преобразовать указатель func к типу PerlIO_funcs *.

PERLIO_FUNCS_DECL

Объявить ftab как таблицу функций PerlIO, то есть, как PerlIO_funcs.

PERLIO_FUNCS_DECL(PerlIO * ftab)
PERLIO_F_APPEND
PERLIO_F_CANREAD
PERLIO_F_CANWRITE
PERLIO_F_CRLF
PERLIO_F_EOF
PERLIO_F_ERROR
PERLIO_F_FASTGETS
PERLIO_F_LINEBUF
PERLIO_F_OPEN
PERLIO_F_RDBUF
PERLIO_F_TEMP
PERLIO_F_TRUNCATE
PERLIO_F_UNBUF
PERLIO_F_UTF8
PERLIO_F_WRBUF

Описано в perliol.

PERLIO_K_BUFFERED
PERLIO_K_CANCRLF
PERLIO_K_FASTGETS
PERLIO_K_MULTIARG
PERLIO_K_RAW

Описано в perliol.

PERLIO_NOT_STDIO

Описано в perlapio.

PL_maxsysfd

Описано в perliol.

repeatcpy

Создать count копий len байтов, начиная с from, и поместить их в память, начиная с to, которая должна быть достаточно большой, чтобы вместить их все.

void  repeatcpy(char* to, const char* from, I32 len, IV count)
USE_STDIO

Описано в perlapio.

Целые числа

CASTI32

Этот символ определён, если компилятор C может преобразовать отрицательные или большие числа с плавающей точкой в 32-битные целые.

HAS_INT64_T

Этот символ будет определён, если компилятор C поддерживает int64_t. Обычно для этого нужно включить inttypes.h, но иногда достаточно sys/types.h.

HAS_LONG_LONG

Этот символ будет определён, если компилятор C поддерживает long long.

HAS_QUAD

Если этот символ определён, это означает, что существует 64-битный целочисленный тип Quad_t и его беззнаковый аналог Uquad_t. QUADKIND будет одним из QUAD_IS_INT, QUAD_IS_LONG, QUAD_IS_LONG_LONG, QUAD_IS_INT64_T, или QUAD_IS___INT64.

I8
I16
I32
I64
IV

Описано в perlguts.

I32SIZE

Этот символ содержит sizeof(I32).

I32TYPE

Этот символ определяет тип C, используемый для I32 Perl.

I64SIZE

Этот символ содержит sizeof(I64).

I64TYPE

Этот символ определяет тип C, используемый для I64 Perl.

I16SIZE

Этот символ содержит sizeof(I16).

I16TYPE

Этот символ определяет тип C, используемый для I16 Perl.

INT16_C
INT32_C
INT64_C

Возвращает идентификатор, который компилятор C распознаёт как константу number соответствующего целочисленного типа на машине.

Если машина не имеет 64-битного типа, INT64_C не определено. Используйте "INTMAX_C" для получения наибольшего доступного типа на платформе.

I16  INT16_C(number)
I32  INT32_C(number)
I64  INT64_C(number)
INTMAX_C

Возвращает идентификатор, который компилятор C распознаёт как константу number самого широкого целочисленного типа на машине. Например, если машина имеет long longs, то INTMAX_C(-1) вернёт

-1LL

См. также, например, "INT32_C".

Используйте "IV" для объявления переменных максимального размера, используемого на данной платформе.

INTMAX_C(number)
INTSIZE

Этот символ содержит значение sizeof(int), чтобы препроцессор C мог принимать решения на его основе.

I8SIZE

Этот символ содержит sizeof(I8).

I8TYPE

Этот символ определяет тип C, используемый для I8 Perl.

IV_MAX

Наибольшее целое число со знаком, которое помещается в IV на данной платформе.

IV  IV_MAX
IV_MIN

Наименьшее целое число со знаком, наиболее удалённое от 0, которое помещается в IV на данной платформе.

IV  IV_MIN
IVSIZE

Этот символ содержит sizeof(IV).

IVTYPE

Этот символ определяет тип C, используемый для IV Perl.

END_OF_DOCUMENT_MARKER
line_t

Тип данных, используемый для объявления переменных, хранящих номера строк.

LONGLONGSIZE

Эта переменная содержит размер типа long long, чтобы препроцессор C мог принимать решения на основе этого значения. Она определяется только если система поддерживает long long.

LONGSIZE

Эта переменная содержит значение sizeof(long), чтобы препроцессор C мог принимать решения на основе этого значения.

memzero

Устанавливает l байтов, начиная с адреса *d, в нули.

void  memzero(void * d, Size_t l)
PERL_INT_FAST8_T
PERL_INT_FAST16_T
PERL_UINT_FAST8_T
PERL_UINT_FAST16_T

Эти значения эквивалентны соответствующим определениям типов C99 на платформах, которые их поддерживают; они равны int и unsigned int на платформах, которые не поддерживают их, позволяя использовать эту функцию C99 в переносимом коде.

PERL_INT_MAX
PERL_INT_MIN
PERL_LONG_MAX
PERL_LONG_MIN
PERL_SHORT_MAX
PERL_SHORT_MIN
PERL_UCHAR_MAX
PERL_UCHAR_MIN
PERL_UINT_MAX
PERL_UINT_MIN
PERL_ULONG_MAX
PERL_ULONG_MIN
PERL_USHORT_MAX
PERL_USHORT_MIN
PERL_QUAD_MAX
PERL_QUAD_MIN
PERL_UQUAD_MAX
PERL_UQUAD_MIN

Эти значения представляют наибольшее и наименьшее число, представимые на текущей платформе в переменных соответствующих типов.

Для знаковых типов наименьшее представимое число — это самое отрицательное число, наиболее удалённое от нуля.

Для компиляторов C99 и более поздних версий эти значения соответствуют значениям, таким как INT_MAX, доступным в коде C. Но эти константы, предоставленные Perl, позволяют коду, скомпилированному на более ранних компиляторах, иметь доступ к тем же константам в переносимом виде.

SHORTSIZE

Эта переменная содержит значение sizeof(short), чтобы препроцессор C мог принимать решения на основе этого значения.

U8
U16
U32
U64
UV

Описание в perlguts.

U32SIZE

Эта переменная содержит sizeof(U32).

U32TYPE

Эта переменная определяет тип C, используемый для Perl's U32.

U64SIZE

Эта переменная содержит sizeof(U64).

U64TYPE

Эта переменная определяет тип C, используемый для Perl's U64.

U16SIZE

Эта переменная содержит sizeof(U16).

U16TYPE

Эта переменная определяет тип C, используемый для Perl's U16.

UINT16_C
UINT32_C
UINT64_C

Возвращает идентификатор, распознаваемый компилятором C для константы number соответствующего беззнакового целочисленного типа на машине.

Если на машине нет 64-битного типа, UINT64_C не определено. Используйте "UINTMAX_C" для получения наибольшего доступного типа на платформе.

U16  UINT16_C(number)
U32  UINT32_C(number)
U64  UINT64_C(number)
UINTMAX_C

Возвращает идентификатор, распознаваемый компилятором C для константы number самого широкого беззнакового целочисленного типа на машине. Например, если на машине есть longs, UINTMAX_C(1) вернет

1UL

См. также, например, "UINT32_C".

Используйте "UV" для объявления переменных максимального размера, поддерживаемого на данной платформе.

UINTMAX_C(number)
U8SIZE

Эта переменная содержит sizeof(U8).

U8TYPE

Эта переменная определяет тип C, используемый для Perl's U8.

UV_MAX

Наибольшее беззнаковое целое число, которое помещается в UV на этой платформе.

UV  UV_MAX
UV_MIN

Наименьшее беззнаковое целое число, которое помещается в UV на этой платформе. Оно должно быть равно нулю.

UV  UV_MIN
UVSIZE

Эта переменная содержит sizeof(UV).

UVTYPE

Эта переменная определяет тип C, используемый для Perl's UV.

WIDEST_UTYPE

Возвращает самый широкий беззнаковый целочисленный тип на платформе, в настоящее время либо U32 или U64. Это можно использовать в объявлениях, таких как

WIDEST_UTYPE my_uv;

или приведениях типов

my_uv = (WIDEST_UTYPE) val;

Форматы ввода-вывода

Используются для форматирования соответствующего типа. Например, вместо

Perl_newSVpvf(pTHX_ "Create an SV with a %d in it\n", iv);

используйте

Perl_newSVpvf(pTHX_ "Create an SV with a " IVdf " in it\n", iv);

Это избавляет от необходимости знать, например, нужно ли выводить IV как %d, %ld или что-то другое.

IVdf

Эта переменная определяет строку формата, используемую для вывода Perl IV как целого числа со знаком в десятичном формате.

NVef

Эта переменная определяет строку формата, используемую для вывода Perl NV с использованием плавающей точки формата %e.

NVff

Эта переменная определяет строку формата, используемую для вывода Perl NV с использованием плавающей точки формата %f.

NVgf

Эта переменная определяет строку формата, используемую для вывода Perl NV с использованием плавающей точки формата %g.

PERL_PRIeldbl

Если определена, эта переменная содержит строку, используемую stdio для форматирования длинных двойных чисел (формат 'e') для вывода.

PERL_PRIfldbl

Если определена, эта переменная содержит строку, используемую stdio для форматирования длинных двойных чисел (формат 'f') для вывода.

PERL_PRIgldbl

Если определена, эта переменная содержит строку, используемую stdio для форматирования длинных двойных чисел (формат 'g') для вывода.

PERL_SCNfldbl

Если определена, эта переменная содержит строку, используемую stdio для форматирования длинных двойных чисел (формат 'f') для ввода.

PRINTF_FORMAT_NULL_OK

Разрешает __printf__ формат быть пустым при проверке printf-стиля

SVf

Описание в perlguts.

SVfARG

Описание в perlguts.

SVfARG(SV *sv)
UTF8f

Описание в perlguts.

UTF8fARG

Описание в perlguts.

UTF8fARG(bool is_utf8, Size_t byte_len, char *str)
UVf

DEPRECATED! Планируется удалить UVf в будущих релизах Perl. Не используйте её в новом коде; удалите её из существующего кода.

Устаревшая форма UVuf, которую вы должны заменить на

const char *  UVf
UVof

Эта переменная определяет строку формата, используемую для вывода Perl UV как беззнакового восьмеричного целого числа.

UVuf

Эта переменная определяет строку формата, используемую для вывода Perl UV как беззнакового десятичного целого числа.

UVXf

Эта переменная определяет строку формата, используемую для вывода Perl UV как беззнакового шестнадцатеричного целого числа в верхнем регистре ABCDEF.

UVxf

Эта переменная определяет строку формата, используемую для вывода Perl UV как беззнакового шестнадцатеричного целого числа в нижнем регистре abcdef.

Интерфейс лексического анализатора

Это нижний уровень парсера Perl, управляющий символами и токенами.

BHK

Описание в perlguts.

lex_bufutf8

ПРИМЕЧАНИЕ: lex_bufutf8 является экспериментальной функцией и может быть изменена или удалена без предварительного уведомления.

Указывает, следует ли интерпретировать байты в буфере лексического анализатора ("PL_parser->linestr") как кодировку UTF-8 для символов Юникода. В противном случае они должны интерпретироваться как символы Latin-1. Это аналогично флагу SvUTF8 для скаляров.

В режиме UTF-8 не гарантируется, что буфер лексического анализатора содержит действительный UTF-8. Код лексического анализа должен быть устойчив к некорректной кодировке.

Флаг SvUTF8 скаляра "PL_parser->linestr" важен, но не является единственным фактором кодировки ввода. Обычно, когда файл считывается, скаляр содержит байты, и его флаг SvUTF8 выключен, но байты должны интерпретироваться как UTF-8, если pragma use utf8 активен. Однако во время выполнения строки eval скаляр может иметь флаг SvUTF8 включенным, и в этом случае его байты должны интерпретироваться как UTF-8, если pragma use bytes не активен. Эта логика может измениться в будущем; используйте эту функцию вместо реализации логики самостоятельно.

bool  lex_bufutf8()
lex_discard_to

ПРИМЕЧАНИЕ: lex_discard_to является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Отбрасывает первую часть буфера "PL_parser->linestr", до ptr. Остальное содержимое буфера будет перемещено, и все указатели на буфер будут обновлены соответствующим образом. ptr не должен находиться позже в буфере, чем позиция "PL_parser->bufptr": запрещено отбрасывать текст, который ещё не был прочитан лексическим анализатором.

Обычно нет необходимости делать это напрямую, так как достаточно использовать неявное поведение отбрасывания "lex_next_chunk" и связанных с ним функций. Однако, если токен охватывает несколько строк, и код лексического анализатора сохранил несколько строк текста в буфере для этой цели, то после завершения токена было бы разумно явно отбросить теперь ненужные предыдущие строки, чтобы избежать разрастания буфера за счёт будущих многострочных токенов.

void  lex_discard_to(char* ptr)
lex_grow_linestr

ПРИМЕЧАНИЕ: lex_grow_linestr является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Перевыделяет буфер лексического анализатора ("PL_parser->linestr") для размещения не менее len байтов (включая завершающий NUL). Возвращает указатель на перевыделенный буфер. Это необходимо перед любым непосредственным изменением буфера, которое увеличит его длину. "lex_stuff_pvn" предоставляет более удобный способ вставки текста в буфер.

Не используйте SvGROW или sv_grow напрямую для PL_parser->linestr; эта функция обновляет все переменные лексического анализатора, которые указывают непосредственно на буфер.

char*  lex_grow_linestr(STRLEN len)
lex_next_chunk

ПРИМЕЧАНИЕ: lex_next_chunk является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Считывает следующий фрагмент текста для лексического анализа, добавляя его к "PL_parser->linestr". Это следует вызывать, когда код лексического анализатора дошёл до конца текущего фрагмента и хочет узнать больше. Обычно, но не обязательно, лексический анализ должен был израсходовать весь текущий фрагмент к этому времени.

Если "PL_parser->bufptr" указывает на самый конец текущего фрагмента (т.е., текущий фрагмент был полностью использован), то обычно текущий фрагмент будет отброшен одновременно со чтением нового фрагмента. Если flags имеет установленный бит LEX_KEEP_PREVIOUS, текущий фрагмент не будет отброшен. Если текущий фрагмент не был полностью использован, он не будет отброшен независимо от флага.

Возвращает true, если в буфер был добавлен новый текст, или false, если буфер достиг конца входного текста.

bool  lex_next_chunk(U32 flags)
lex_peek_unichar

ПРИМЕЧАНИЕ: lex_peek_unichar является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Смотрит вперёд на один (Unicode) символ в тексте, который в данный момент анализируется. Возвращает код символа (целое беззнаковое значение) следующего символа или -1, если лексический анализ достиг конца входного текста. Для потребления просмотренного символа используйте "lex_read_unichar".

Если следующий символ находится (или выходит) за пределы следующего фрагмента входного текста, следующий фрагмент будет прочитан. Обычно текущий фрагмент будет отброшен одновременно, но если flags имеет установленный бит LEX_KEEP_PREVIOUS, текущий фрагмент не будет отброшен.

Если вход интерпретируется как UTF-8, и встречается ошибка кодирования UTF-8, генерируется исключение.

I32  lex_peek_unichar(U32 flags)
lex_read_space

ПРИМЕЧАНИЕ: lex_read_space является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Читает необязательные пробелы в стиле Perl в тексте, который в данный момент анализируется. Пробелы могут включать обычные символы пробелов и комментарии в стиле Perl. #line директивы обрабатываются при их обнаружении. "PL_parser->bufptr" перемещается мимо пробелов, так что он указывает на символ, не являющийся пробелом (или конец входного текста).

Если пробелы выходят за пределы следующего фрагмента входного текста, следующий фрагмент будет прочитан. Обычно текущий фрагмент будет отброшен одновременно, но если flags имеет установленный бит LEX_KEEP_PREVIOUS, текущий фрагмент не будет отброшен.

void  lex_read_space(U32 flags)
lex_read_to

ПРИМЕЧАНИЕ: lex_read_to является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Потребляет текст в буфере лексического анализатора, от "PL_parser->bufptr" до ptr. Это перемещает "PL_parser->bufptr" для соответствия ptr, выполняя правильное ведение записей при прохождении символа новой строки. Это обычный способ потребления прочитанного текста.

Интерпретацию байтов буфера можно абстрагировать, используя немного более высокоуровневые функции "lex_peek_unichar" и "lex_read_unichar".

void  lex_read_to(char* ptr)
lex_read_unichar

ПРИМЕЧАНИЕ: lex_read_unichar является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Читает следующий (Unicode) символ в тексте, который в данный момент анализируется. Возвращает код символа (беззнаковое целое значение) прочитанного символа и перемещает "PL_parser->bufptr" мимо символа или возвращает -1, если лексический анализ достиг конца входного текста. Для неразрушающего изучения следующего символа используйте "lex_peek_unichar".

Если следующий символ находится (или выходит) за пределы следующего фрагмента входного текста, следующий фрагмент будет прочитан. Обычно текущий фрагмент будет отброшен одновременно, но если flags имеет установленный бит LEX_KEEP_PREVIOUS, текущий фрагмент не будет отброшен.

Если вход интерпретируется как UTF-8, и встречается ошибка кодирования UTF-8, генерируется исключение.

I32  lex_read_unichar(U32 flags)
lex_start

ПРИМЕЧАНИЕ: lex_start является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Создаёт и инициализирует новый объект состояния лексического анализатора/парсера, предоставляя контекст для лексического анализа и разбора нового исходного кода Perl. Указатель на новый объект состояния помещается в "PL_parser". Запись делается в стеке сохранения, так что при развёртывании новый объект состояния будет уничтожен, а предыдущее значение "PL_parser" будет восстановлено. Для очистки контекста разбора ничего больше делать не нужно.

Парсируемый код происходит из line и rsfp. line, если не null, предоставляет строку (в форме SV) содержащую код для парсинга. Создаётся копия строки, поэтому последующее изменение line не повлияет на парсинг. rsfp, если не null, предоставляет входной поток, из которого будет считываться код для парсинга. Если оба не null, код в line идёт первым и должен состоять из полных строк ввода, а rsfp предоставляет остаток источника.

Параметр flags зарезервирован для будущего использования. В настоящее время он используется только в Perl, поэтому расширения всегда должны передавать ноль.

void  lex_start(SV* line, PerlIO *rsfp, U32 flags)
lex_stuff_pv

ПРИМЕЧАНИЕ: lex_stuff_pv является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Вставляет символы в буфер лексического анализатора ("PL_parser->linestr") сразу после текущей точки лексического анализа ("PL_parser->bufptr"), перевыделяя буфер при необходимости. Это означает, что код лексического анализатора, который выполняется позже, увидит символы так, как будто они появились во вводе. Это не рекомендуется как часть обычного парсинга, и большинство применений этой функции рискуют интерпретировать вставленные символы нежелательным образом.

Строка, подлежащая вставке, представлена байтами, начинающимися с pv и продолжающимися до первого нуля. Эти байты интерпретируются как UTF-8 или Latin-1 в зависимости от того, установлен ли флаг LEX_STUFF_UTF8 в flags. Символы закодированы для буфера лексического анализатора в соответствии с тем, как буфер в данный момент интерпретируется ("lex_bufutf8"). Если неудобно завершать строку, подлежащую вставке, нулём, функция "lex_stuff_pvn" более уместна.

void  lex_stuff_pv(const char* pv, U32 flags)
lex_stuff_pvn

ПРИМЕЧАНИЕ: lex_stuff_pvn является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Вставляет символы в буфер лексического анализатора ("PL_parser->linestr") сразу после текущей точки лексического анализа ("PL_parser->bufptr"), перевыделяя буфер при необходимости. Это означает, что код лексического анализатора, который выполняется позже, увидит символы так, как будто они появились во вводе. Это не рекомендуется как часть обычного парсинга, и большинство применений этой функции рискуют интерпретировать вставленные символы нежелательным образом.

Строка, подлежащая вставке, представлена len байтами, начинающимися с pv. Эти байты интерпретируются как UTF-8 или Latin-1, в зависимости от того, установлен ли флаг LEX_STUFF_UTF8 в flags. Символы закодированы для буфера лексического анализатора в соответствии с тем, как буфер в данный момент интерпретируется ("lex_bufutf8"). Если строка, подлежащая вставке, доступна в виде скаляра Perl, функция "lex_stuff_sv" более удобна.

void  lex_stuff_pvn(const char* pv, STRLEN len, U32 flags)
lex_stuff_pvs

ПРИМЕЧАНИЕ: lex_stuff_pvs является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Подобно "lex_stuff_pvn", но принимает строку-литерал вместо пары строка/длина.

void  lex_stuff_pvs("pv", U32 flags)
lex_stuff_sv

ПРИМЕЧАНИЕ: lex_stuff_sv является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Вставляет символы в буфер лексера ("PL_parser->linestr"), сразу после текущей точки лексического анализа ("PL_parser->bufptr"), перевыделяя буфер при необходимости. Это означает, что код лексического анализа, выполняемый позже, увидит символы так, как будто они появились в исходном коде. Не рекомендуется делать это в рамках обычного синтаксического анализа, и большинство случаев использования этого средства рискуют тем, что вставленные символы будут интерпретированы нежелательным образом.

Строка, подлежащая вставке, — это строковое значение sv. Символы закодированы для буфера лексера в соответствии с текущей интерпретацией буфера ("lex_bufutf8"). Если строка, подлежащая вставке, не является уже скалярной Perl, функция "lex_stuff_pvn" позволяет избежать необходимости создания скаляра.

void  lex_stuff_sv(SV* sv, U32 flags)
lex_unstuff

ПРИМЕЧАНИЕ: lex_unstuff является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Удаляет текст, который собирается быть проанализированным лексером, от "PL_parser->bufptr" до ptr. Текст, следующий за ptr, будет перемещён, а буфер будет укорочен. Это скрывает отменённый текст от любого кода лексического анализа, который выполняется позже, как если бы текст никогда не появлялся.

Это не обычный способ потребления проанализированного текста. Для этого используйте "lex_read_to".

void  lex_unstuff(char* ptr)
parse_arithexpr

ПРИМЕЧАНИЕ: parse_arithexpr является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Парсит арифметическое выражение Perl. Оно может содержать операторы с приоритетом до операторов сдвига битов. Выражение должно быть после (и таким образом завершаться) оператором сравнения или оператором с меньшим приоритетом или чем-то, что обычно завершает выражение, например, точкой с запятой. Если flags имеет установленный бит PARSE_OPTIONAL, то выражение является необязательным, в противном случае оно обязательно. От пользователя зависит обеспечение корректной настройки динамического состояния парсера ("PL_parser" и т.д.) для отражения источника анализируемого кода и лексического контекста для выражения.

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

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

OP*  parse_arithexpr(U32 flags)
parse_barestmt

ПРИМЕЧАНИЕ: parse_barestmt является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Парсит одно незатейливое Perl-утверждение. Это может быть обычное оперативное утверждение или объявление, имеющее влияние на время компиляции. Оно не включает метки или другие приставки. От пользователя зависит обеспечение корректной настройки динамического состояния парсера ("PL_parser" и т.д.) для отражения источника анализируемого кода и лексического контекста для утверждения.

Возвращает дерево операций, представляющее утверждение. Может быть нулевым указателем, если утверждение является нулевым, например, если это было фактически определение подпрограммы (которое имеет последствия на время компиляции). Если не нулевой, это будут операции, непосредственно реализующие утверждение, подходящие для передачи в "newSTATEOP". Обычно он не будет включать операцию nextstate или её эквивалент (за исключением тех, которые встроены в область, полностью содержащуюся в утверждении).

Параметр flags зарезервирован для будущего использования и должен всегда быть нулевым.

OP*  parse_barestmt(U32 flags)
parse_block

ПРИМЕЧАНИЕ: parse_block является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Парсит один полный Perl-блок кода. Он состоит из открывающей фигурной скобки, последовательности утверждений и закрывающей фигурной скобки. Блок представляет собой лексическую область, поэтому переменные my и различные последствия во время компиляции могут быть в нём заключены. От пользователя зависит обеспечение корректной настройки динамического состояния парсера ("PL_parser" и т.д.) для отражения источника анализируемого кода и лексического контекста для утверждения.

Возвращает дерево операций, представляющее блок кода. Это всегда действительная операция, никогда не нулевой указатель. Это обычно список lineseq, включая nextstate или эквивалентные операции. Операции для построения любого вида области выполнения не включены в силу того, что это блок.

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

Параметр flags зарезервирован для будущего использования и должен всегда быть нулевым.

OP*  parse_block(U32 flags)
parse_fullexpr

ПРИМЕЧАНИЕ: parse_fullexpr является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Парсит одно полное Perl-выражение. Это позволяет использовать всю грамматику выражений, включая операторы с наименьшим приоритетом, такие как or. Выражение должно быть после (и таким образом завершаться) токеном, которым обычно завершается выражение: конец файла, закрывающие скобки, точка с запятой или одно из ключевых слов, которое сигнализирует о постфиксном модификаторе утверждения выражения. Если flags имеет установленный бит PARSE_OPTIONAL, то выражение необязательно, в противном случае оно обязательно. От пользователя зависит обеспечение корректной настройки динамического состояния парсера ("PL_parser" и т.д.) для отражения источника анализируемого кода и лексического контекста для выражения.

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

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

OP*  parse_fullexpr(U32 flags)
parse_fullstmt

ПРИМЕЧАНИЕ: parse_fullstmt является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Парсит одно полное Perl-утверждение. Это может быть обычное оперативное утверждение или объявление, имеющее влияние на время компиляции, и может включать необязательные метки. От пользователя зависит обеспечение корректной настройки динамического состояния парсера ("PL_parser" и т.д.) для отражения источника анализируемого кода и лексического контекста для утверждения.

Возвращает дерево операций, представляющее утверждение. Может быть нулевым указателем, если утверждение является нулевым, например, если это было фактически определение подпрограммы (которое имеет последствия на время компиляции). Если не нулевой, это результат вызова "newSTATEOP", обычно включающий операцию nextstate или её эквивалент.

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

Параметр flags зарезервирован для будущего использования и должен всегда быть нулевым.

OP*  parse_fullstmt(U32 flags)
parse_label

ПРИМЕЧАНИЕ: parse_label является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Парсит одну метку, возможно необязательную, типа, которая может предшествовать Perl-утверждению. От пользователя зависит обеспечение корректной настройки динамического состояния парсера ("PL_parser" и т.д.) для отражения источника анализируемого кода. Если flags имеет установленный бит PARSE_OPTIONAL, то метка необязательна, в противном случае она обязательна.

Имя метки возвращается в виде нового скаляра. Если необязательная метка отсутствует, возвращается нулевой указатель.

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

SV*  parse_label(U32 flags)
parse_listexpr

ПРИМЕЧАНИЕ: parse_listexpr является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Парсит список Perl-выражений. Он может содержать операторы с приоритетом до оператора запятой. Выражение должно быть после (и таким образом завершаться) оператором логики с низким приоритетом, например, or, или чем-то, что обычно завершает выражение, например, точкой с запятой. Если flags имеет установленный бит PARSE_OPTIONAL, то выражение необязательно, в противном случае оно обязательно. От пользователя зависит обеспечение корректной настройки динамического состояния парсера ("PL_parser" и т.д.) для отражения источника анализируемого кода и лексического контекста для выражения.

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

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

OP*  parse_listexpr(U32 flags)
parse_stmtseq

ПРИМЕЧАНИЕ: parse_stmtseq является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Разбирает последовательность нуля или более операторов Perl. Эти операторы могут быть обычными операторами императивного стиля, включая необязательные метки, или объявления, имеющие влияние во время компиляции, или любое их сочетание. Последовательность операторов заканчивается, когда встречается закрывающая фигурная скобка или конец файла в месте, где новый оператор мог бы быть допустимым. От пользователя требуется обеспечить, что динамическое состояние парсера ("PL_parser" и т.д.) правильно установлено для отражения источника разборного кода и лексического контекста операторов.

Возвращает дерево синтаксического анализа (op tree), представляющее последовательность операторов. Это может быть нулевой указатель, если все операторы были нулевыми, например, если операторов не было или были только определения подпрограмм (которые имеют побочные эффекты во время компиляции). Если указатель не нулевой, это будет список lineseq, обычно включая nextstate или эквивалентные операторы.

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

Параметр flags зарезервирован для будущего использования и всегда должен быть равен нулю.

OP*  parse_stmtseq(U32 flags)
parse_subsignature

ПРИМЕЧАНИЕ: parse_subsignature является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Разбирает объявление подписи подпрограммы. Это содержимое скобок, следующих за объявлением именованной или безымянной подпрограммы, когда включена функция signatures. Обратите внимание, что эта функция не ожидает и не потребляет открывающую и закрывающую скобки вокруг подписи; от пользователя требуется обработать их.

Эта функция должна вызываться только во время разбора подпрограммы; после вызова "start_subparse". Она может выделять лексические переменные в стеке текущей подпрограммы.

Возвращает дерево синтаксического анализа (op tree) для распаковки аргументов из стека во время выполнения. Это дерево синтаксического анализа должно появляться в начале скомпилированной функции. Пользователь может использовать "op_append_list" для построения тела своей функции после него или объединить его с телом до вызова "newATTRSUB".

Параметр flags зарезервирован для будущего использования и всегда должен быть равен нулю.

OP*  parse_subsignature(U32 flags)
parse_termexpr

ПРИМЕЧАНИЕ: parse_termexpr является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Разбирает выражение Perl типа «терм». Оно может содержать операторы с приоритетом до операторов присваивания. Выражение должно быть после (и, таким образом, завершено) запятой, оператором с более низким приоритетом или чем-то, что обычно завершает выражение, таким как точка с запятой. Если у flags установлен бит PARSE_OPTIONAL, то выражение является необязательным, иначе оно является обязательным. От пользователя требуется обеспечить, что динамическое состояние парсера ("PL_parser" и т.д.) правильно установлено для отражения источника разборного кода и лексического контекста выражения.

Возвращает дерево синтаксического анализа (op tree), представляющее выражение. Если необязательное выражение отсутствует, возвращается нулевой указатель, в противном случае указатель не нулевой.

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

OP*  parse_termexpr(U32 flags)
PL_parser

Указатель на структуру, содержащую состояние операции разбора, которая в настоящее время выполняется. Указатель может быть изменён локально для выполнения вложенного разбора без влияния на состояние внешнего разбора. Отдельные члены PL_parser имеют свою документацию.

PL_parser->bufend

ПРИМЕЧАНИЕ: PL_parser->bufend является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Прямой указатель на конец части текста, в настоящее время анализируемой лексическим анализатором, конец буфера лексического анализатора. Это равно SvPVX(PL_parser->linestr) + SvCUR(PL_parser->linestr). В конце буфера всегда находится символ NUL (нулевой байт), и он не считается частью содержимого буфера.

PL_parser->bufptr

ПРИМЕЧАНИЕ: PL_parser->bufptr является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Указывает на текущую позицию лексического анализа внутри буфера лексического анализатора. Символы вокруг этой точки могут быть свободно проанализированы в пределах диапазона, ограниченного SvPVX("PL_parser->linestr") и "PL_parser->bufend". Байты буфера могут быть предназначены для интерпретации как UTF-8 или Latin-1, как указано в "lex_bufutf8".

Код лексического анализа (будь то в ядре Perl или нет) перемещает этот указатель дальше по символам, которые он потребляет. Также ожидается, что он выполнит некоторые действия по учёту, когда потребляется символ новой строки. Это перемещение может быть более удобно выполнено функцией "lex_read_to", которая обрабатывает новые строки должным образом.

Интерпретацию байтов буфера можно абстрагировать, используя чуть более высокие функции "lex_peek_unichar" и "lex_read_unichar".

PL_parser->linestart

ПРИМЕЧАНИЕ: PL_parser->linestart является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Указывает на начало текущей строки внутри буфера лексического анализатора. Это полезно для указания колонки, в которой произошла ошибка, и мало для чего ещё. Этот указатель должен обновляться любым кодом лексического анализа, который потребляет символ новой строки; функция "lex_read_to" обрабатывает эту деталь.

PL_parser->linestr

ПРИМЕЧАНИЕ: PL_parser->linestr является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Скаляр буфера, содержащий часть текста, в настоящее время рассматриваемого лексическим анализатором. Это всегда обычный скаляр строки (для которого SvPOK истинно). Он не предназначен для использования в качестве скаляра обычным способом; вместо этого обратитесь к буферу напрямую с помощью указателей переменных, описанных ниже.

Лексический анализатор поддерживает различные указатели char* на вещи в буфере PL_parser->linestr. Если буфер PL_parser->linestr перевыделяется, все эти указатели должны быть обновлены. Не пытайтесь делать это вручную, а используйте "lex_grow_linestr", если вам нужно перевыделить буфер.

Содержимое части текста в буфере часто является одной полной строкой входных данных, включая символ новой строки, но есть ситуации, когда это не так. Байты буфера могут быть предназначены для интерпретации как UTF-8 или Latin-1. Функция "lex_bufutf8" сообщает вам это. Не используйте флаг SvUTF8 на этом скаляре, который может не соответствовать ему.

Для непосредственного просмотра буфера переменная "PL_parser->bufend" указывает на конец буфера. Текущая позиция лексического анализатора указывается переменной "PL_parser->bufptr". Прямое использование этих указателей обычно предпочтительнее, чем просмотр скаляра обычным способом.

wrap_keyword_plugin

ПРИМЕЧАНИЕ: wrap_keyword_plugin является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Добавляет функцию C в цепочку плагинов ключевых слов. Это предпочтительный способ управления переменной "PL_keyword_plugin". new_plugin - указатель на функцию C, которая должна быть добавлена в цепочку плагинов ключевых слов, а old_plugin_p указывает на место хранения указателя на следующую функцию в цепочке. Значение new_plugin записывается в переменную "PL_keyword_plugin", а ранее сохранённое значение записывается в *old_plugin_p.

"PL_keyword_plugin" является глобальной для всего процесса, и модуль, желающий подключить разбор ключевых слов, может быть вызван более одного раза за процесс, обычно в разных потоках. Чтобы справиться с этой ситуацией, эта функция идемпотентна. Место *old_plugin_p должно первоначально (один раз за процесс) содержать нулевой указатель. Переменная C со статическим сроком действия (объявленная на уровне файла, обычно также отмеченная static для предоставления внутренней связи) будет неявно инициализирована должным образом, если у неё нет явного инициализатора. Эта функция будет фактически изменять цепочку плагинов только если найдёт *old_plugin_p равным нулю. Эта функция также безопасна для многопоточной обработки в малом масштабе. Она использует соответствующие блокировки, чтобы избежать гонок при доступе к "PL_keyword_plugin".

Когда эта функция вызывается, функция, на которую ссылается new_plugin, должна быть готова к вызову, за исключением *old_plugin_p, которое не заполнено. В ситуации с несколькими потоками, new_plugin может быть вызвана немедленно, даже прежде, чем эта функция вернётся. *old_plugin_p всегда будет установлено должным образом перед вызовом new_plugin. Если new_plugin решит ничего не делать со своим идентификатором (что является обычным случаем для большинства вызовов плагина ключевых слов), он должен передать ссылку на функцию плагина, на которую ссылается *old_plugin_p.

Взяв всё вместе, код XS для установки плагина ключевого слова обычно выглядит примерно так:

static Perl_keyword_plugin_t next_keyword_plugin;
static OP *my_keyword_plugin(pTHX_
    char *keyword_ptr, STRLEN keyword_len, OP **op_ptr)
{
    if (memEQs(keyword_ptr, keyword_len,
               "my_new_keyword")) {
        ...
    } else {
        return next_keyword_plugin(aTHX_
            keyword_ptr, keyword_len, op_ptr);
    }
}
BOOT:
    wrap_keyword_plugin(my_keyword_plugin,
                        &next_keyword_plugin);

Прямого доступа к "PL_keyword_plugin" следует избегать.

void  wrap_keyword_plugin(Perl_keyword_plugin_t new_plugin,
                          Perl_keyword_plugin_t *old_plugin_p)

Локали

DECLARATION_FOR_LC_NUMERIC_MANIPULATION

Этот макрос должен использоваться как оператор. Он объявляет частную переменную (имя которой начинается с нижнего подчёркивания), необходимую для других макросов в этом разделе. Неправильная реализация этого макроса должна приводить к синтаксической ошибке. Для совместимости с компиляторами C89 C она должна быть помещена в блок перед любыми выполнимыми операторами.

void  DECLARATION_FOR_LC_NUMERIC_MANIPULATION
foldEQ_locale

Возвращает true, если первые len байты строк s1 и s2 совпадают без учёта регистра в текущей локали; в противном случае возвращает false.

I32  foldEQ_locale(const char* a, const char* b, I32 len)
HAS_DUPLOCALE

Если этот символ определён, это указывает на то, что функция duplocale доступна для дублирования объекта локали.

HAS_FREELOCALE

Если этот символ определён, это указывает на то, что функция freelocale доступна для освобождения ресурсов, связанных с объектом локали.

HAS_LC_MONETARY_2008

Этот символ, если определён, указывает, что функция localeconv доступна и содержит дополнительные члены, добавленные в POSIX 1003.1-2008.

HAS_LOCALECONV

Этот символ, если определён, указывает, что функция localeconv доступна для числового и денежного форматирования.

HAS_LOCALECONV_L

Этот символ, если определён, указывает, что функция localeconv_l доступна для запроса определённой информации о локали.

HAS_NEWLOCALE

Этот символ, если определён, указывает, что функция newlocale доступна для возвращения нового объекта локали или изменения существующего.

HAS_NL_LANGINFO

Этот символ, если определён, указывает, что функция nl_langinfo доступна для возвращения локальных данных. Вам также понадобится langinfo.h и, следовательно, I_LANGINFO.

HAS_NL_LANGINFO_L

Этот символ, при определении, указывает на наличие функции nl_langinfo_l()

HAS_QUERYLOCALE

Этот символ, если определён, указывает, что функция querylocale доступна для возвращения имени локали для маски категории.

HAS_SETLOCALE

Этот символ, если определён, указывает, что функция setlocale доступна для обработки реализаций функций ctype, специфичных для локали.

HAS_SETLOCALE_R

Этот символ, если определён, указывает, что функция setlocale_r доступна для установки локали повторно-входным способом.

HAS_THREAD_SAFE_NL_LANGINFO_L

Этот символ, при определении, указывает на наличие функции nl_langinfo_l(), и что она потокобезопасна.

HAS_USELOCALE

Этот символ, если определён, указывает, что функция uselocale доступна для установки текущей локали для вызывающей потока.

I_LANGINFO

Этот символ, если определён, указывает, что langinfo.h существует и должен быть включён.

#ifdef I_LANGINFO
    #include <langinfo.h>
#endif
I_LOCALE

Этот символ, если определён, указывает C-программе, что она должна включить locale.h.

#ifdef I_LOCALE
    #include <locale.h>
#endif
IN_LOCALE

Принимает значение TRUE, если предикаты локали без параметров (use locale) активны.

bool  IN_LOCALE
IN_LOCALE_COMPILETIME

Принимает значение TRUE, если при компиляции Perl-программы (включая eval) предикаты локали без параметров (use locale) активны.

bool  IN_LOCALE_COMPILETIME
IN_LOCALE_RUNTIME

Принимает значение TRUE, если при выполнении Perl-программы (включая eval) предикаты локали без параметров (use locale) активны.

bool  IN_LOCALE_RUNTIME
I_XLOCALE

Этот символ, если определён, указывает C-программе, что заголовок xlocale.h доступен. См. также "NEED_XLOCALE_H"

#ifdef I_XLOCALE
    #include <xlocale.h>
#endif
NEED_XLOCALE_H

Этот символ, если определён, указывает C-программе, что она должна включить xlocale.h для получения newlocale() и его друзей.

Perl_langinfo

Это (почти) прямая замена системной функции nl_langinfo(3), принимающая те же item параметры и возвращающая ту же информацию. Но она более потокобезопасна, чем обычная функция nl_langinfo(), скрывает особенности обработки локали Perl в вашем коде и может использоваться на системах, где отсутствует нативная функция nl_langinfo

Подробнее:

  • Причина, по которой это не полная замена, на самом деле является преимуществом. Единственное отличие заключается в том, что она возвращает const char *, тогда как обычная функция nl_langinfo() возвращает char *, но вам запрещено записывать в буфер (по документации). Объявив эту const, компилятор накладывает это ограничение, так что если оно нарушено, вы узнаете об этом во время компиляции, а не получите ошибки сегментации во время выполнения.

  • Она возвращает правильные результаты для RADIXCHAR и THOUSEP элементов, без необходимости дополнительного кода. Причина дополнительного кода заключается в том, что они из категории локали LC_NUMERIC, которая обычно устанавливается Perl так, что радикс — точка, а разделитель — пустая строка, независимо от того, какой должна быть основная локали, и поэтому для получения ожидаемых результатов необходимо временно переключиться на основную локаль, а затем вернуться назад. (Вы можете использовать обычные функции nl_langinfo и "STORE_LC_NUMERIC_FORCE_TO_UNDERLYING", но тогда вы не получите других преимуществ Perl_langinfo(); не сохранение LC_NUMERIC в C (или эквивалентной) локали нарушит много модулей CPAN, ожидающих, что символ радикса (десятичной точки) будет точкой.)

  • Системная функция, которую она заменяет, может иметь свой статический буфер возврата, повреждённый не только последующим вызовом этой функции, но и freelocale, setlocale, или другим изменением локали. Буфер, возвращаемый этой функцией, не изменяется до следующего вызова, поэтому буфер никогда не находится в повреждённом состоянии.

  • Её буфер возврата относится к потоку, поэтому он также никогда не перезаписывается вызовом этой функции из другого потока; в отличие от заменяемой функции.

  • Но самое главное, она работает на системах, где нет nl_langinfo, таких как Windows, что делает ваш код более переносимым. Из пятидесяти с лишним возможных элементов, указанных в стандарте POSIX 2008, http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/langinfo.h.html, только один полностью не реализован, хотя на платформах, не являющихся Windows, ещё один существенный тоже не реализован. Она использует различные методы для восстановления других элементов, включая вызов localeconv(3) и strftime(3), оба из которых указаны в C89, поэтому должны всегда быть доступны. Более поздние версии strftime() имеют дополнительные возможности; "" возвращается для тех, которые недоступны на вашей системе.

    Важно отметить, что при вызове с элементом, который восстанавливается с помощью localeconv, буфер из любого предыдущего явного вызова localeconv будет перезаписан. Это означает, что вам нужно сохранить содержимое этого буфера, если вам нужно получить к нему доступ после вызова этой функции. (Но обратите внимание, что вам может не понадобиться использовать localeconv() напрямую, из-за проблем, упомянутых во втором пункте этого списка (выше) для RADIXCHAR и THOUSEP. Вы можете использовать методы, указанные в perlcall, для вызова "localeconv" в POSIX и избежать всех проблем, но тогда у вас будет хеш для распаковки.)

    Подробности о тех элементах, которые могут отличаться от того, что возвращает эта эмуляция, и от того, что вернула бы нативная функция nl_langinfo(), указаны в I18N::Langinfo.

При использовании Perl_langinfo на системах, где нет нативной функции nl_langinfo(), вы должны

#include "perl_langinfo.h"

перед perl.h #include. Вы можете заменить вашу langinfo.h #include этой. (Такой способ исключает символы, которые обычная функция langinfo.h попытается импортировать в пространство имён для кода, которому это не нужно.)

Исходным побуждением для Perl_langinfo() было то, чтобы код, которому нужно получить текущий символ валюты, символ радикса с плавающей запятой или разделитель групп цифр, мог использовать упрощённый и более безопасный с точки зрения потоков nl_langinfo API вместо localeconv(3), что сложно сделать потокобезопасным. Для других возвращаемых функцией localeconv полей лучше использовать методы, указанные в perlcall, для вызова POSIX::localeconv(), который является потокобезопасным.

const char*  Perl_langinfo(const nl_item item)
Perl_setlocale

Это (почти) прямая замена системной функции setlocale(3), принимающей те же параметры и возвращающей ту же информацию, за исключением того, что она возвращает правильную базовую локаль LC_NUMERIC. Обычная функция setlocale вместо этого вернёт C , если базовая локали имеет символ десятичной точки, отличный от точки, или непустой разделитель тысяч для отображения чисел с плавающей запятой. Это происходит потому, что Perl сохраняет эту категорию локали так, что она имеет точку и пустой разделитель, временно изменяя локаль во время операций, где необходима базовая. Perl_setlocale знает об этом и компенсирует это; обычная функция setlocale — нет.

Ещё одна причина, по которой это не полная замена, заключается в том, что она объявлена как возвращающая const char *, тогда как системная функция setlocale опускает const (предположительно потому, что её API был определён давно и не может быть обновлён; запрещено изменять информацию, возвращаемую setlocale ; попытка сделать это приведёт к ошибкам сегментации.)

Наконец, Perl_setlocale работает во всех случаях, тогда как обычная функция setlocale может быть совершенно неэффективна на некоторых платформах в некоторых конфигурациях.

Perl_setlocale не следует использовать для изменения локали, за исключением систем, где предопределённая переменная ${^SAFE_LOCALES} равна 1. На некоторых таких системах системная функция setlocale() неэффективна, возвращает неправильную информацию и не меняет локаль. Perl_setlocale, однако, работает правильно во всех случаях.

Возвращаемый указатель на статический буфер потока, который перезаписывается при следующем вызове Perl_setlocale из того же потока.

const char*  Perl_setlocale(const int category,
                            const char* locale)
RESTORE_LC_NUMERIC

Используется в сочетании с одним из макросов "STORE_LC_NUMERIC_SET_TO_NEEDED" и "STORE_LC_NUMERIC_FORCE_TO_UNDERLYING" для правильного восстановления состояния LC_NUMERIC.

Вызов "DECLARATION_FOR_LC_NUMERIC_MANIPULATION" должен быть выполнен для объявления во время компиляции частной переменной, используемой этим макросом и двумя STORE.

Этот макрос следует вызывать как отдельное утверждение, а не выражение, но с пустым списком аргументов, как в этом примере:

{
   DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
    ...
   RESTORE_LC_NUMERIC();
    ...
}
void  RESTORE_LC_NUMERIC()
SETLOCALE_ACCEPTS_ANY_LOCALE_NAME

Этот символ, если определён, указывает, что функция setlocale доступна и принимает любое имя локали в качестве корректного.

STORE_LC_NUMERIC_FORCE_TO_UNDERLYING

Используется кодом XS, который LC_NUMERIC учитывает локаль, для принудительного задания локали для категории LC_NUMERIC на значение, которое Perl считает текущей базовой локалью. (Интерпретатор Perl может ошибаться относительно фактической базовой локали, если какой-то код C или XS вызвал функцию C-библиотеки setlocale(3) в обход; вызов "sync_locale" перед вызовом этой макрокоманды обновит записи Perl.)

Для объявления в процессе компиляции частной переменной, используемой этой макрокомандой, необходимо сделать вызов "DECLARATION_FOR_LC_NUMERIC_MANIPULATION". Эту макрокоманду следует вызывать как отдельное утверждение, а не выражение, но с пустым списком аргументов, подобно этому:

{
   DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
    ...
   STORE_LC_NUMERIC_FORCE_TO_UNDERLYING();
    ...
   RESTORE_LC_NUMERIC();
    ...
}

Частная переменная используется для сохранения текущего состояния локали, чтобы соответствующий вызов "RESTORE_LC_NUMERIC" смог восстановить его.

В многопоточных Perl-интерпретаторах, работающих без многопоточной безопасности, эта макрокоманда использует мьютекс для принудительного создания критической секции. Следовательно, соответствующий RESTORE должен быть рядом и гарантированно вызываться.

void  STORE_LC_NUMERIC_FORCE_TO_UNDERLYING()
STORE_LC_NUMERIC_SET_TO_NEEDED

Используется для обёртки кода XS или C, который LC_NUMERIC учитывает локаль. Эта категория локали обычно устанавливается в локаль, где десятичный разделитель – точка, а разделитель между группами цифр – пустая строка. Это связано с тем, что большинство кодов XS, которые считывают числа с плавающей запятой, ожидают их синтаксис.

Эта макрокоманда гарантирует, что текущее состояние LC_NUMERIC правильно настроено, учитывая локаль, если вызов кода XS или C из Perl-программы происходит внутри области use locale; или игнорирует локаль, если вызов происходит вне такой области.

Эта макрокоманда является началом обёртки C- или XS-кода; завершение обёртки выполняется путём вызова макрокоманды "RESTORE_LC_NUMERIC" после операции. В противном случае состояние может быть изменено, что негативно повлияет на другой код XS.

Для объявления в процессе компиляции частной переменной, используемой этой макрокомандой, необходимо сделать вызов "DECLARATION_FOR_LC_NUMERIC_MANIPULATION". Эту макрокоманду следует вызывать как отдельное утверждение, а не выражение, но с пустым списком аргументов, подобно этому:

{
   DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
    ...
   STORE_LC_NUMERIC_SET_TO_NEEDED();
    ...
   RESTORE_LC_NUMERIC();
    ...
}

В многопоточных Perl-интерпретаторах, работающих без многопоточной безопасности, эта макрокоманда использует мьютекс для принудительного создания критической секции. Следовательно, соответствующий RESTORE должен быть рядом и гарантированно вызываться; см. "WITH_LC_NUMERIC_SET_TO_NEEDED" для более содержательного способа обеспечения этого.

void  STORE_LC_NUMERIC_SET_TO_NEEDED()
STORE_LC_NUMERIC_SET_TO_NEEDED_IN

Аналогично "STORE_LC_NUMERIC_SET_TO_NEEDED", но в качестве значения in_lc_numeric используется предварительно вычисленное значение IN_LC(LC_NUMERIC). Ответственность вызывающей стороны – убедиться, что состояние PL_compiling и PL_hints не изменились с момента предварительного вычисления.

void  STORE_LC_NUMERIC_SET_TO_NEEDED_IN(bool in_lc_numeric)
switch_to_global_locale

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

В многопоточных сборках на системах, которые поддерживают операции с локалью на уровне потока, эта функция переключает поток, в котором она выполняется, на использование глобальной локали. Это для кода, который ещё не был или не может быть обновлён для работы с многопоточными операциями с локалью. Пока только один поток переведён таким образом, всё работает нормально, так как все остальные потоки продолжают игнорировать глобальную, поэтому только этот поток обращает внимание на неё.

Однако в системах Windows это не совсем верно до Visual Studio 15, в какой момент Microsoft исправила ошибку. Возможна гонка, если вы используете следующие операции на более ранних платформах Windows:

POSIX::localeconv
I18N::Langinfo, элементы CRNCYSTR и THOUSEP
"Perl_langinfo" в perlapi, элементы CRNCYSTR и THOUSEP

Первый элемент не может быть исправлен (кроме как обновлением до более поздней версии Visual Studio), но можно обойти два последних элемента, используя функции Windows API GetNumberFormat и GetCurrencyFormat; приветствуются исправления.

Без этого вызова функции потоки, которые используют системную функцию setlocale(3), не будут работать должным образом, так как все чувствительные к локали функции будут использовать локаль на уровне потока, а setlocale не повлияет на этот поток.

Код Perl должен быть преобразован, чтобы либо вызывать Perl_setlocale (который является прямым заменителем системной функции setlocale) либо использовать методы, указанные в perlcall, для вызова POSIX::setlocale. Любой из этих вариантов прозрачно и правильно обрабатывает все случаи, связанные с одно- или многопоточностью, поддержкой POSIX 2008 или её отсутствием.

Библиотеки, не являющиеся Perl, такие как gtk, которые вызывают системную функцию setlocale, могут продолжать работать, если эта функция вызывается перед передачей управления библиотеке.

По возвращении из кода, которому необходимо использовать глобальную локаль, следует вызвать sync_locale() для восстановления безопасной многопоточной работы.

void  switch_to_global_locale()
sync_locale

Perl_setlocale может использоваться в любое время для запроса или изменения локали (хотя изменение локали является антиобщественным и опасным в многопоточных системах, не имеющих многопоточных безопасных операций с локалью. (См. "Многопоточные операции" в perllocale). Следует избегать использования системной функции setlocale(3). Тем не менее, некоторые библиотеки, не являющиеся Perl, вызываемые из XS, такие как Gtk , делают это, и это нельзя изменить. Когда локаль изменяется кодом XS, который не использовал Perl_setlocale, Perl необходимо сообщить об изменении локали. Используйте эту функцию для этого, прежде чем вернуться в Perl.

Возвращаемое значение – булево: ИСТИНА, если глобальная локаль на момент вызова была эффективной; и ЛОЖЬ, если была эффективной локаль на уровне потока. Это может быть использовано вызывающей стороной, которая нуждается в восстановлении исходного состояния, для принятия решения о вызове Perl_switch_to_global_locale.

bool  sync_locale()
WITH_LC_NUMERIC_SET_TO_NEEDED

Эта макрокоманда вызывает предоставленное утверждение или блок в контексте пары "STORE_LC_NUMERIC_SET_TO_NEEDED" .. "RESTORE_LC_NUMERIC", если это необходимо, например:

WITH_LC_NUMERIC_SET_TO_NEEDED(
  SNPRINTF_G(fv, ebuf, sizeof(ebuf), precis)
);

эквивалентно:

  {
#ifdef USE_LOCALE_NUMERIC
    DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
    STORE_LC_NUMERIC_SET_TO_NEEDED();
#endif
    SNPRINTF_G(fv, ebuf, sizeof(ebuf), precis);
#ifdef USE_LOCALE_NUMERIC
    RESTORE_LC_NUMERIC();
#endif
  }
void  WITH_LC_NUMERIC_SET_TO_NEEDED(block)
WITH_LC_NUMERIC_SET_TO_NEEDED_IN

Аналогично "WITH_LC_NUMERIC_SET_TO_NEEDED", но в качестве значения in_lc_numeric используется предварительно вычисленное значение IN_LC(LC_NUMERIC). Ответственность вызывающей стороны – убедиться, что состояние PL_compiling и PL_hints не изменились с момента предварительного вычисления.

void  WITH_LC_NUMERIC_SET_TO_NEEDED_IN(bool in_lc_numeric, block)

Магия

"Магия" – это специальные данные, прикреплённые к структурам SV, чтобы придать им "волшебные" свойства. Когда любой Perl-код пытается прочитать или присвоить значение SV, помеченному как магический, он вызывает функцию 'get' или 'set', связанную с магией этого SV. get вызывается до чтения SV, чтобы дать ему возможность обновить его внутреннее значение (get на $. записывает номер строки последнего прочитанного файла в IV-слот SV), а set вызывается после записи в SV, чтобы позволить ему использовать изменённое значение (set на $/ копирует новое значение SV в глобальную переменную PL_rs).

Магия реализуется как связанный список структур MAGIC, прикреплённых к SV. Каждая структура MAGIC содержит тип магии, указатель на массив функций, которые реализуют функции get(), set(), length() и т.д., а также место для флагов и указателей. Например, связанная переменная имеет структуру MAGIC, которая содержит указатель на объект, связанный с связыванием.

mg_clear

Очистить что-то магическое, что представляет собой SV. См. "sv_magic".

int  mg_clear(SV* sv)
mg_copy

Копирует магию из одного SV в другой. См. "sv_magic".

int  mg_copy(SV *sv, SV *nsv, const char *key, I32 klen)
MGf_COPY
MGf_DUP
MGf_LOCAL

Описание в perlguts.

mg_find

Находит указатель на магию для type , соответствующий SV. См. "sv_magic".

MAGIC*  mg_find(const SV* sv, int type)
mg_findext

Находит указатель на магию type с заданным vtbl для SV. См. "sv_magicext".

MAGIC*  mg_findext(const SV* sv, int type, const MGVTBL *vtbl)
mg_free

Освободить любое хранилище магии, используемое SV. См. "sv_magic".

int  mg_free(SV* sv)
mg_freeext

Удалить любую магию типа how с использованием виртуальной таблицы vtbl из SV sv. См. "sv_magic".

mg_freeext(sv, how, NULL) эквивалентно mg_free_type(sv, how).

void  mg_freeext(SV* sv, int how, const MGVTBL *vtbl)
mg_free_type

Удалить любую магию типа how из SV sv. См. "sv_magic".

void  mg_free_type(SV* sv, int how)
mg_get

Выполнить магию перед получением значения из SV. Тип SV должен быть >= SVt_PVMG. См. "sv_magic".

int  mg_get(SV* sv)
END_OF_DOCUMENT_MARKER
mg_length

Планируется удалить mg_length из будущей версии Perl. Не используйте его в новом коде; удалите его из существующего кода.

Отчеты о длине SV в байтах, вызывая магию длины, если она доступна, но не устанавливая флаг UTF8 на sv. Он вернётся к магии «get», если нет магии «length», но без указания, вызывалась ли магия «get». Предполагается, что sv является PVMG или более поздней версии. Используйте sv_len() вместо этого.

U32  mg_length(SV* sv)
mg_magical

Включает магический статус SV. См. "sv_magic".

void  mg_magical(SV* sv)
mg_set

Выполняет магию после присвоения значения SV. См. "sv_magic".

int  mg_set(SV* sv)
MGVTBL

Описание в perlguts.

perl_clone

Создаёт и возвращает новый интерпретатор, клонируя текущий.

perl_clone принимает эти флаги в качестве параметров:

CLONEf_COPY_STACKS - используется для копирования стеков, без него мы только клонируем данные и обнуляем стеки, с ним мы копируем стеки, и новый интерпретатор Perl готов к выполнению в точной той же точке, что и предыдущий. Псевдо-код fork использует COPY_STACKS, в то время как threads->create — нет.

CLONEf_KEEP_PTR_TABLE - perl_clone сохраняет ptr_table со значением указателя старой переменной в качестве ключа и новой переменной в качестве значения; это позволяет проверить, клонировалась ли переменная, и не клонировать её снова, а просто использовать значение и увеличить счётчик ссылок. Если KEEP_PTR_TABLE не установлен, perl_clone удалит ptr_table, используя функцию ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;. Причина его сохранения — если вы хотите продублировать некоторые свои переменные, которые находятся вне графа, который сканирует Perl.

CLONEf_CLONE_HOST - Это элемент win32, он игнорируется в unix; он сообщает коду win32host Perl (который на C++) о необходимости клонирования себя. Это необходимо в win32, если вы хотите запустить две потоки одновременно. Если вы хотите просто сделать что-то в отдельном интерпретаторе Perl, а затем выбросить его и вернуться к исходному, вам ничего не нужно делать.

PerlInterpreter*  perl_clone(PerlInterpreter *proto_perl,
                             UV flags)
PERL_MAGIC_arylen
PERL_MAGIC_arylen_p
PERL_MAGIC_backref
PERL_MAGIC_bm
PERL_MAGIC_checkcall
PERL_MAGIC_collxfrm
PERL_MAGIC_dbfile
PERL_MAGIC_dbline
PERL_MAGIC_debugvar
PERL_MAGIC_defelem
PERL_MAGIC_env
PERL_MAGIC_envelem
PERL_MAGIC_ext
PERL_MAGIC_fm
PERL_MAGIC_hints
PERL_MAGIC_hintselem
PERL_MAGIC_isa
PERL_MAGIC_isaelem
PERL_MAGIC_lvref
PERL_MAGIC_nkeys
PERL_MAGIC_nonelem
PERL_MAGIC_overload_table
PERL_MAGIC_pos
PERL_MAGIC_qr
PERL_MAGIC_regdata
PERL_MAGIC_regdatum
PERL_MAGIC_regex_global
PERL_MAGIC_rhash
PERL_MAGIC_shared
PERL_MAGIC_shared_scalar
PERL_MAGIC_sig
PERL_MAGIC_sigelem
PERL_MAGIC_substr
PERL_MAGIC_sv
PERL_MAGIC_symtab
PERL_MAGIC_taint
PERL_MAGIC_tied
PERL_MAGIC_tiedelem
PERL_MAGIC_tiedscalar
PERL_MAGIC_utf8
PERL_MAGIC_uvar
PERL_MAGIC_uvar_elem
PERL_MAGIC_vec
PERL_MAGIC_vstring

Описание в perlguts.

ptr_table_fetch

Ищет sv в таблице отображения указателей tbl, возвращая его значение или NULL, если не найдено.

void*  ptr_table_fetch(PTR_TBL_t *const tbl, const void *const sv)
ptr_table_free

Очистка и освобождение таблицы ptr.

void  ptr_table_free(PTR_TBL_t *const tbl)
ptr_table_new

Создание новой таблицы отображения указателей.

PTR_TBL_t*  ptr_table_new()
ptr_table_split

Удвоение размера корзины хэша существующей таблицы ptr.

void  ptr_table_split(PTR_TBL_t *const tbl)
ptr_table_store

Добавление новой записи в таблицу отображения указателей tbl. В терминах хэшей oldsv — ключ; Cnewsv> — значение.

Названия «old» и «new» специфичны для типичного использования ptr_tables в Perl для клонирования потоков.

void  ptr_table_store(PTR_TBL_t *const tbl,
                      const void *const oldsv, void *const newsv)
SvTIED_obj

Описание в perlinterp.

SvTIED_obj(SV *sv, MAGIC *mg)

Управление памятью

dump_mstats

При компиляции с включённым -DDEBUGGING_MSTATS, выводит статистику о malloc в виде двух строк чисел: первая показывает длину свободного списка для каждой категории размеров, вторая — количество malloc - free для каждой категории размеров.

s, если не NULL, используется в качестве фразы в выводе, например, "после компиляции".

void  dump_mstats(const char* s)
HASATTRIBUTE_MALLOC

Можно ли обработать атрибут GCC для функций типа malloc.

HAS_MALLOC_GOOD_SIZE

Если этот символ определён, это указывает на доступность функции malloc_good_size.

HAS_MALLOC_SIZE

Если этот символ определён, это указывает на доступность функции malloc_size.

I_MALLOCMALLOC

Если этот символ определён, это указывает C-программе на необходимость включения malloc/malloc.h.

#ifdef I_MALLOCMALLOC
    #include <mallocmalloc.h>
#endif
MYMALLOC

Если этот символ определён, это указывает на использование собственного malloc.

Newx
safemalloc

Интерфейс XSUB-писателя к C-функции malloc.

Память, полученную с помощью этой функции, ТОЛЬКО нужно освобождать с помощью "Safefree".

В версии 5.9.3 Newx() и друзья заменили более старую API New(), и убрали первый параметр x, который являлся вспомогательным средством отладки, позволявшим вызывающим сторонам идентифицировать себя. Это вспомогательное средство было заменено новой опцией сборки PERL_MEM_LOG (см. "PERL_MEM_LOG" в perlhacktips). Более старая API по-прежнему доступна для использования в модулях XS, поддерживающих более старые версии Perl.

void   Newx      (void* ptr, int nitems, type)
void*  safemalloc(size_t size)
Newxc

Интерфейс XSUB-писателя к C-функции malloc с приведением типа. См. также "Newx".

Память, полученную с помощью этой функции, ТОЛЬКО нужно освобождать с помощью "Safefree".

void  Newxc(void* ptr, int nitems, type, cast)
Newxz
safecalloc

Интерфейс XSUB-писателя к C-функции malloc. Выделенная память обнуляется с помощью memzero. См. также "Newx".

Память, полученную с помощью этой функции, ТОЛЬКО нужно освобождать с помощью "Safefree".

void   Newxz     (void* ptr, int nitems, type)
void*  safecalloc(size_t nitems, size_t item_size)
PERL_MALLOC_WRAP

Если этот символ определён, это указывает на включение проверок обёртки malloc.

Renew
saferealloc

Интерфейс XSUB-писателя к C-функции realloc.

Память, полученную с помощью этой функции, ТОЛЬКО нужно освобождать с помощью "Safefree".

void   Renew      (void* ptr, int nitems, type)
void*  saferealloc(void *ptr, size_t size)
Renewc

Интерфейс XSUB-писателя к C-функции realloc с приведением типа.

Память, полученную с помощью этой функции, ТОЛЬКО нужно освобождать с помощью "Safefree".

void  Renewc(void* ptr, int nitems, type, cast)
Safefree

Интерфейс XSUB-писателя к C-функции free.

Использовать ТОЛЬКО с памятью, полученной с помощью "Newx" и друзей.

void  Safefree(void* ptr)
safesyscalloc

Безопасная версия системной функции calloc()

Malloc_t  safesyscalloc(MEM_SIZE elements, MEM_SIZE size)
safesysfree

Безопасная версия системной функции free()

Free_t  safesysfree(Malloc_t where)
safesysmalloc

Внимательная версия системной функции malloc()

Malloc_t  safesysmalloc(MEM_SIZE nbytes)
safesysrealloc

Внимательная версия системной функции realloc()

Malloc_t  safesysrealloc(Malloc_t where, MEM_SIZE nbytes)

Порядок разрешения методов

Эти функции относятся к порядку разрешения методов классов Perl. Также см. perlmroapi.

HvMROMETA

Описание в perlmroapi.

struct mro_meta *  HvMROMETA(HV *hv)
mro_get_from_name

Возвращает ранее зарегистрированный порядок разрешения методов с заданным name, или NULL, если не зарегистрирован. См. "mro_register".

ПРИМЕЧАНИЕ: mro_get_from_name должен быть явно вызван как Perl_mro_get_from_name с параметром aTHX_.

const struct mro_alg *  Perl_mro_get_from_name(pTHX_ SV *name)
mro_get_linear_isa

Возвращает линейное упорядочивание mro для заданного хранилища. По умолчанию это будет то, что возвращает mro_get_linear_isa_dfs, если не применяется какой-либо другой порядок разрешения методов для хранилища. Возвращаемое значение — константный AV*.

Вы несете ответственность за SvREFCNT_inc() возвращаемого значения, если планируете сохранить его где-либо полупостоянно (в противном случае оно может быть удалено из-под вас в следующий раз, когда кеш будет обновлён).

AV*  mro_get_linear_isa(HV* stash)
MRO_GET_PRIVATE_DATA

Описание в perlmroapi.

SV*  MRO_GET_PRIVATE_DATA(struct mro_meta *const smeta,
                          const struct mro_alg *const which)
mro_method_changed_in

Отменяет кеширование метода для всех дочерних классов данного хранилища, чтобы они могли заметить изменения в нём.

В идеале, все экземпляры PL_sub_generation++ в perl-источнике вне mro.c должны быть заменены вызовами этой функции.

Perl автоматически обрабатывает большинство распространённых способов переопределения метода. Однако существуют несколько способов изменить метод в хранилище, не затронув код кеширования, в этом случае вам необходимо вызвать этот метод позднее:

1) Прямое манипулирование записями хранилища HV из кода XS.

2) Присваивание ссылки на неизменяемый скаляр-константу в запись хранилища, чтобы создать константную подпрограмму (как делает constant.pm).

Этот же метод доступен из чистого Perl через mro::method_changed_in(classname).

void  mro_method_changed_in(HV* stash)
mro_register

Регистрирует пользовательский плагин mro. Подробнее об этой и других функциях mro см. в perlmroapi.

ПРИМЕЧАНИЕ: mro_register должен быть явно вызван как Perl_mro_register с параметром aTHX_.

void  Perl_mro_register(pTHX_ const struct mro_alg *mro)
mro_set_mro

Устанавливает значение meta в соответствии со значениями зарегистрированного плагина mro с именем name.

Возвращает ошибку, если name не был зарегистрирован.

ПРИМЕЧАНИЕ: mro_set_mro должен быть явно вызван как Perl_mro_set_mro с параметром aTHX_.

void  Perl_mro_set_mro(pTHX_ struct mro_meta *const meta,
                       SV *const name)
mro_set_private_data

Описание см. в perlmroapi.

ПРИМЕЧАНИЕ: mro_set_private_data должен быть явно вызван как Perl_mro_set_private_data с параметром aTHX_.

SV*  Perl_mro_set_private_data(pTHX_
                               struct mro_meta *const smeta,
                               const struct mro_alg *const which,
                               SV *const data)

Функции Multicall

dMULTICALL

Объявляет локальные переменные для multicall. См. "ЛЕГКОВЕСНЫЕ КОРРЕКЦИИ" в perlcall.

dMULTICALL;
MULTICALL

Создаёт лёгковесную корректировку. См. "ЛЕГКОВЕСНЫЕ КОРРЕКЦИИ" в perlcall.

MULTICALL;
POP_MULTICALL

Закрывающая скобка для лёгковесной корректировки. См. "ЛЕГКОВЕСНЫЕ КОРРЕКЦИИ" в perlcall.

POP_MULTICALL;
PUSH_MULTICALL

Открывающая скобка для лёгковесной корректировки. См. "ЛЕГКОВЕСНЫЕ КОРРЕКЦИИ" в perlcall.

PUSH_MULTICALL(CV* the_cv);

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

Atol

DEPRECATED! Планируется удалить Atol из будущих релизов Perl. Не используйте его в новом коде; удалите его из существующего кода.

Описание см. в perlhacktips.

Atol(const char * nptr)
Atoul

DEPRECATED! Планируется удалить Atoul из будущих релизов Perl. Не используйте его в новом коде; удалите его из существующего кода.

Описание см. в perlhacktips.

Atoul(const char * nptr)
Drand01

Эта макрокоманда используется для генерации равномерно распределённых случайных чисел в диапазоне [0., 1.[. Возможно, вам нужно добавить 'extern double drand48();' в свою программу, так как SunOS 4.1.3 не предоставляет ничего соответствующего в своих заголовках. См. "HAS_DRAND48_PROTO".

double  Drand01()
Gconvert

Эта макрокоманда препроцессора предназначена для преобразования числа с плавающей запятой в строку без заключительной десятичной точки. Это имитирует поведение sprintf("%g"), но иногда намного эффективнее. Если gconvert() недоступен, но gcvt() опускает заключительную десятичную точку, то используется gcvt(). В случае неудачи используется макрокоманда с sprintf("%g"). Аргументы для макрокоманды Gconvert: значение, количество цифр, сохранять ли заключительные нули и буфер вывода. Обычно используются следующие значения:

d_Gconvert='gconvert((x),(n),(t),(b))'
d_Gconvert='gcvt((x),(n),(b))'
d_Gconvert='sprintf((b),"%.*g",(n),(x))'

Последние два предполагают, что заключительные нули не сохраняются.

char *  Gconvert(double x, Size_t n, bool t, char * b)
grok_atoUV

Разбирает строку, ищет целое десятичное число без знака.

На входе pv указывает на начало строки; valptr указывает на UV, который получит преобразованное значение, если найдено; endptr равен NULL или указывает на переменную, указывающую на один байт за точкой в pv, которую эта процедура должна проверить. Если endptr равен NULL, предполагается, что pv имеет завершение NUL.

Возвращает FALSE, если pv не представляет собой корректное целое беззнаковое десятичное число (без ведущих нулей). В противном случае возвращает TRUE и устанавливает *valptr на это значение.

Если вы ограничиваете часть pv, которая рассматривается этой функцией (передавая не-NULL endptr), и если начальные байты этой части образуют корректное значение, она вернёт TRUE, установив *endptr на байт, следующий за последней цифрой значения. Но если ограничений нет, вся pv должна быть корректной, чтобы вернуть TRUE. *endptr не изменяется со значения, полученного на входе, если возвращается FALSE;

Эта функция принимает только десятичные цифры '0'..'9'.

В отличие от atoi(3) или strtol(3), grok_atoUV не допускает необязательных начальных пробелов, а также отрицательных входных данных. Если требуется такая функциональность, вызывающий код должен явно её реализовать.

Обратите внимание, что эта функция возвращает FALSE для входов, которые выходят за пределы UV или имеют ведущие нули. Таким образом, одиночный 0 принимается, но не 00 и 01, 002, и т.д.

Предыстория: atoi имеет серьёзные проблемы с незаконными входами, не может использоваться для инкрементального разбора и поэтому должен быть избегнут atoi и strtol также зависят от настроек локали, что тоже можно считать ошибкой (глобальное состояние, управляемое пользовательской средой).

bool  grok_atoUV(const char* pv, UV* valptr, const char** endptr)
grok_bin

Преобразует строку, представляющую двоичное число, в числовой вид.

На входе start и *len_p предоставляют строку для сканирования, *flags предоставляет флаги преобразования, а result должно быть NULL или указателем на NV. Сканирование прекращается в конце строки или перед первой некорректной буквой. Если в *flags не установлен PERL_SCAN_SILENT_ILLDIGIT, обнаружение некорректного символа (кроме NUL) также вызовет предупреждение. По возвращении *len_p устанавливается на длину просканированной строки, а *flags предоставляет флаги вывода.

Если значение меньше или равно UV_MAX, оно возвращается как UV, флаги вывода очищаются, и ничего не записывается в *result. Если значение больше UV_MAX, grok_bin возвращает UV_MAX, устанавливает PERL_SCAN_GREATER_THAN_UV_MAX во флагах вывода и записывает приблизительное значение в *result (которое является NV; или приближение отбрасывается, если result равен NULL).

Двоичное число может необязательно быть префиксным "0b" или "b", если PERL_SCAN_DISALLOW_PREFIX не установлен в *flags на входе.

Если PERL_SCAN_ALLOW_UNDERSCORES установлен в *flags, то любые или все пары цифр могут быть разделены одиночной подчёркиванием; также принимается одиночное ведущее подчёркивание.

UV  grok_bin(const char* start, STRLEN* len_p, I32* flags,
             NV *result)
grok_hex

Преобразует строку, представляющую шестнадцатеричное число, в числовой вид.

На входе start и *len_p предоставляют строку для сканирования, *flags предоставляет флаги преобразования, а result должно быть NULL или указателем на NV. Сканирование прекращается в конце строки или перед первой некорректной буквой. Если в *flags не установлен PERL_SCAN_SILENT_ILLDIGIT, обнаружение некорректного символа (кроме NUL) также вызовет предупреждение. По возвращении *len_p устанавливается на длину просканированной строки, а *flags предоставляет флаги вывода.

Если значение меньше или равно UV_MAX, оно возвращается как UV, флаги вывода очищаются, и ничего не записывается в *result. Если значение больше UV_MAX, grok_hex возвращает UV_MAX, устанавливает PERL_SCAN_GREATER_THAN_UV_MAX во флагах вывода и записывает приблизительное значение в *result (которое является NV; или приближение отбрасывается, если result равен NULL).

Шестнадцатеричное число может необязательно быть префиксным "0x" или "x", если PERL_SCAN_DISALLOW_PREFIX не установлен в *flags на входе.

Если PERL_SCAN_ALLOW_UNDERSCORES установлен в *flags, то любые или все пары цифр могут быть разделены одиночной подчёркиванием; также принимается одиночное ведущее подчёркивание.

UV  grok_hex(const char* start, STRLEN* len_p, I32* flags,
             NV *result)
grok_infnan

Вспомогательная функция для grok_number(), принимает различные способы написания "бесконечность" или "не число" и возвращает одну из следующих комбинаций флагов:

IS_NUMBER_INFINITY
IS_NUMBER_NAN
IS_NUMBER_INFINITY | IS_NUMBER_NEG
IS_NUMBER_NAN | IS_NUMBER_NEG
0

возможно, |-ed с IS_NUMBER_TRAILING.

Если распознана бесконечность или не число, *sp будет указывать на байт после конца распознанной строки. Если распознавание не удалось, возвращается ноль, а *sp не сдвинется.

int  grok_infnan(const char** sp, const char *send)
grok_number

Идентична grok_number_flags() с flags установленным в ноль.

int  grok_number(const char *pv, STRLEN len, UV *valuep)
grok_number_flags

Распознавание (или игнорирование) числа. Возвращается тип числа (0, если не распознано), иначе это битовое ИЛИ из IS_NUMBER_IN_UV, IS_NUMBER_GREATER_THAN_UV_MAX, IS_NUMBER_NOT_INT, IS_NUMBER_NEG, IS_NUMBER_INFINITY, IS_NUMBER_NAN (определены в perl.h).

Если значение числа может уместиться в UV, оно возвращается в *valuep. IS_NUMBER_IN_UV устанавливается для указания, что *valuep является допустимым, IS_NUMBER_IN_UV никогда не устанавливается, если *valuep не допустимо, но *valuep может быть назначено во время обработки, даже если IS_NUMBER_IN_UV не установлено при возврате. Если valuep равно NULL, IS_NUMBER_IN_UV будет установлено в тех же случаях, что и когда valuep не равно NULL, но никакого фактического назначения (или SEGV) не произойдёт.

IS_NUMBER_NOT_INT устанавливается с IS_NUMBER_IN_UV, если были замечены десятичные разделители (в этом случае *valuep даёт истинное значение, усеченное до целого), и IS_NUMBER_NEG, если число отрицательное (в этом случае *valuep содержит абсолютное значение). IS_NUMBER_IN_UV не устанавливается, если использовался формат e или число больше, чем UV.

flags разрешает только PERL_SCAN_TRAILING, что позволяет иметь нечисловой текст в конце строки, после чего grok выполняется успешно, устанавливая IS_NUMBER_TRAILING в результате.

int  grok_number_flags(const char *pv, STRLEN len, UV *valuep,
                       U32 flags)
GROK_NUMERIC_RADIX

Синоним для "grok_numeric_radix"

bool  GROK_NUMERIC_RADIX(NN const char **sp, NN const char *send)
grok_numeric_radix

Сканирование и пропуск числового десятичного разделителя (основания).

bool  grok_numeric_radix(const char **sp, const char *send)
grok_oct

Преобразует строку, представляющую восьмеричное число, в числовую форму.

На входе start и *len_p содержат строку для сканирования, *flags задаёт флаги преобразования, и result должно быть NULL или указатель на NV. Сканирование останавливается в конце строки или перед первой недопустимой (не NUL) символом. Если PERL_SCAN_SILENT_ILLDIGIT установлен в *flags, встреча с недопустимым символом (кроме NUL) также сгенерирует предупреждение. При возврате *len_p устанавливается в длину отсканированной строки, а *flags содержит флаги результата.

Если значение ≤ UV_MAX, оно возвращается как UV, флаги результата очищаются, и ничего не записывается в *result. Если значение > UV_MAX, grok_oct возвращает UV_MAX, устанавливает PERL_SCAN_GREATER_THAN_UV_MAX в флагах результата и записывает приблизительное значение в *result (которое является NV; или приближение отбрасывается, если result равно NULL).

Если PERL_SCAN_ALLOW_UNDERSCORES установлен в *flags, то любые или все пары цифр могут быть разделены одиночным символом нижнего подчеркивания; также допускается единственное ведущее нижнее подчеркивание.

Флаг PERL_SCAN_DISALLOW_PREFIX всегда рассматривается как установленный для этой функции.

UV  grok_oct(const char* start, STRLEN* len_p, I32* flags,
             NV *result)
isinfnan

Perl_isinfnan() — вспомогательная функция, которая возвращает true, если аргумент NV является бесконечностью или NaN, в противном случае — false. Для более детальной проверки используйте Perl_isinf() и Perl_isnan().

Это также логическое отрицание Perl_isfinite().

bool  isinfnan(NV nv)
my_atof

atof(3), но корректно работает с обработкой локалей Perl, всегда принимает точкой символ разделителя, но также и символ разделителя текущей локали, если и только если вызвана из области лексического действия инструкции Perl use locale.

Примечание: s должен быть завершён NUL.

NV  my_atof(const char *s)
my_strtod

Эта функция эквивалентна функции libc strtod(), и доступна даже на платформах, где нет обычной функции strtod(). Её значение возврата — наилучшая доступная точность, в зависимости от возможностей платформы и опций Configure.

Она корректно обрабатывает локальный символ разделителя, ожидая точку, за исключением вызова из области действия use locale, в этом случае символом разделителя должна быть специфицированная текущей локалью.

Вместо этого можно использовать синоним Strtod().

NV  my_strtod(const char * const s, char ** e)
PERL_ABS

Бестиповое abs или fabs, и т. д. (Использование ниже указывает, что это для целых чисел, но оно работает для любого типа). Используйте вместо них, так как стандартные функции C-библиотеки вынуждают их аргумент быть того типа, которого они ожидают, что может привести к катастрофе. Но также помните, что этот аргумент оценивается дважды, поэтому нет x++.

int  PERL_ABS(int x)
Perl_acos
Perl_asin
Perl_atan
Perl_atan2
Perl_ceil
Perl_cos
Perl_cosh
Perl_exp
Perl_floor
Perl_fmod
Perl_frexp
Perl_isfinite
Perl_isinf
Perl_isnan
Perl_ldexp
Perl_log
Perl_log10
Perl_modf
Perl_pow
Perl_sin
Perl_sinh
Perl_sqrt
Perl_tan
Perl_tanh

Выполняют соответствующую математическую операцию над операндами, используя функцию libc, предназначенную для задачи, которая имеет достаточно точности для NV на этой платформе. Если такая функция с достаточной точностью не существует, используется функция наивысшей доступной точности.

NV  Perl_acos    (NV x)
NV  Perl_asin    (NV x)
NV  Perl_atan    (NV x)
NV  Perl_atan2   (NV x, NV y)
NV  Perl_ceil    (NV x)
NV  Perl_cos     (NV x)
NV  Perl_cosh    (NV x)
NV  Perl_exp     (NV x)
NV  Perl_floor   (NV x)
NV  Perl_fmod    (NV x, NV y)
NV  Perl_frexp   (NV x, int *exp)
IV  Perl_isfinite(NV x)
IV  Perl_isinf   (NV x)
IV  Perl_isnan   (NV x)
NV  Perl_ldexp   (NV x, int exp)
NV  Perl_log     (NV x)
NV  Perl_log10   (NV x)
NV  Perl_modf    (NV x, NV *iptr)
NV  Perl_pow     (NV x, NV y)
NV  Perl_sin     (NV x)
NV  Perl_sinh    (NV x)
NV  Perl_sqrt    (NV x)
NV  Perl_tan     (NV x)
NV  Perl_tanh    (NV x)
Perl_signbit

ПРИМЕЧАНИЕ: Perl_signbit — экспериментальная функция и может быть изменена или удалена без предварительного уведомления.

Возвращает ненулевое целое число, если бит знака NV установлен, и 0, если он не установлен.

Если Configure обнаруживает, что система имеет функцию signbit(), которая будет работать с нашими NV, то мы просто используем её через #define в perl.h. В противном случае возвращается реализация по умолчанию. Основное назначение этой функции — отлавливание -0.0.

Примечания: Эта функция называется 'Perl_signbit', а не просто 'signbit', так как легко представить систему, которая имеет функцию или макрос signbit(), который не работает с нашими NV. Мы не должны просто переименовывать #define signbit в Perl_signbit и ожидать, что стандартные заголовки системных библиотек будут счастливы. Кроме того, это функция без контекста (без pTHX_), поскольку Perl_signbit() обычно переопределяется в perl.h как простая макро-вызов системной функции signbit(). Пользователи должны всегда вызывать Perl_signbit().

int  Perl_signbit(NV f)
PL_hexdigit

Этот массив, индексируемый целым числом, преобразует это значение в соответствующий ему символ. Например, если вход — 8, возвращаемое значение — строка, первый символ которой '8'. Фактически возвращается указатель в строку. Вас интересует только первый символ этой строки. Чтобы получить заглавные буквы (для значений 10..15), добавьте 16 к индексу. Таким образом, PL_hexdigit[11] — 'b', а PL_hexdigit[11+16] — 'B'. Добавление 16 к индексу, представленному '0'..'9', даёт то же, что и без добавления 16. Индексы вне диапазона 0..31 приводят к (недопустимому) неопределённому поведению.

READ_XDIGIT

Возвращает значение шестнадцатеричной цифры в формате ASCII и сдвигает указатель строки. Поведение корректно только когда isXDIGIT(*str) — true.

U8  READ_XDIGIT(char str*)
scan_bin

Для обратной совместимости. Используйте grok_bin вместо этого.

NV  scan_bin(const char* start, STRLEN len, STRLEN* retlen)
scan_hex

Для обратной совместимости. Используйте grok_hex вместо этого.

NV  scan_hex(const char* start, STRLEN len, STRLEN* retlen)
scan_oct

Для обратной совместимости. Используйте grok_oct вместо этого.

NV  scan_oct(const char* start, STRLEN len, STRLEN* retlen)
seedDrand01

Этот символ определяет макрос, используемый для инициализации генератора псевдослучайных чисел (см. "Drand01").

void  seedDrand01(Rand_seed_t x)
Strtod

Это синоним для "my_strtod".

NV  Strtod(NN const char * const s, NULLOK char ** e)
Strtol

Платформенно-независимая strtol. Это расширяется до соответствующей функции типа strotol, основанной на платформе и опциях Configure. Например, она может расшириться до strtoll или strtoq вместо strtol.

NV  Strtol(NN const char * const s, NULLOK char ** e, int base)
Strtoul

Платформенно-независимая strtoul. Это расширяется до соответствующей функции типа strotoul, основанной на платформе и опциях Configure. Например, она может расшириться до strtoull или strtouq вместо strtoul.

NV  Strtoul(NN const char * const s, NULLOK char ** e, int base)

Деревья вариантов

alloccopstash

ПРИМЕЧАНИЕ: alloccopstash — экспериментальная функция и может быть изменена или удалена без предварительного уведомления.

Доступна только в многопоточных сборках, эта функция выделяет запись в PL_stashpad для передаваемого ей хранилища.

PADOFFSET  alloccopstash(HV *hv)
BINOP

Описание в perlguts.

block_end

Обработка выхода из области видимости во время компиляции. floor — индекс стека сохранений, возвращённый block_start, а seq — тело блока. Возвращает блок, возможно, изменённый.

OP*  block_end(I32 floor, OP* seq)
block_start

Обработка входа в область видимости во время компиляции. Обеспечивает восстановление подсказок при выходе из блока и также обрабатывает номера последовательностей области видимости, чтобы лексические переменные работали правильно. Возвращает индекс стека сохранений, для использования с block_end.

int  block_start(int full)
END_OF_DOCUMENT_MARKER
ck_entersub_args_list

Выполняет стандартную обработку части аргументов в дереве операций entersub. Она заключается в применении контекста списка к каждой из операций аргументов. Это стандартная обработка, используемая для вызова, помеченного &, или для вызова метода, или для вызова через ссылку на подпрограмму, или для любого другого вызова, где вызываемый объект не может быть идентифицирован во время компиляции, или для вызова, где вызываемый объект не имеет прототипа.

OP*  ck_entersub_args_list(OP *entersubop)
ck_entersub_args_proto

Выполняет обработку части аргументов в дереве операций entersub на основе прототипа подпрограммы. Это вносит различные изменения в операции аргументов, от применения контекста до вставки операций refgen, и проверки количества и синтаксических типов аргументов в соответствии с прототипом. Это стандартная обработка, используемая для вызова подпрограммы, не помеченного &, где вызываемый объект может быть идентифицирован во время компиляции и имеет прототип.

protosv предоставляет подлежащий применению прототип подпрограммы для вызова. Это может быть обычный скаляр, значение строки которого будет использовано. В качестве альтернативы, для удобства, это может быть объект подпрограммы (CV*, преобразованный в SV*), имеющий прототип. Предоставленный прототип, в любой форме, не обязательно должен соответствовать фактически вызываемому объекту, на который ссылается дерево операций.

Если операции аргументов не соответствуют прототипу, например, из-за неприемлемого количества аргументов, всё равно возвращается корректное дерево операций. Ошибка отражается в состоянии парсера, что обычно приводит к одному исключению на верхнем уровне разбора, которое охватывает все ошибки компиляции, произошедшие. В сообщении об ошибке вызываемый объект обозначается именем, определённым параметром namegv.

OP*  ck_entersub_args_proto(OP *entersubop, GV *namegv,
                            SV *protosv)
ck_entersub_args_proto_or_list

Выполняет обработку части аргументов в дереве операций entersub на основе прототипа подпрограммы или с использованием обработки по умолчанию для контекста списка. Это стандартная обработка, используемая для вызова подпрограммы, не помеченного &, где вызываемый объект может быть идентифицирован во время компиляции.

protosv предоставляет прототип подпрограммы для применения к вызову или указывает, что прототип отсутствует. Это может быть обычный скаляр, в котором случае, если он определён, его строковое значение будет использовано в качестве прототипа, а если он не определён, то прототип отсутствует. В качестве альтернативы, для удобства, это может быть объект подпрограммы (CV*, преобразованный в SV*), прототип которого будет использован, если он существует. Предоставленный прототип (или его отсутствие) в любой форме не обязательно должен соответствовать фактически вызываемому объекту, на который ссылается дерево операций.

Если операции аргументов не соответствуют прототипу, например, из-за неприемлемого количества аргументов, всё равно возвращается корректное дерево операций. Ошибка отражается в состоянии парсера, что обычно приводит к одному исключению на верхнем уровне разбора, которое охватывает все ошибки компиляции, произошедшие. В сообщении об ошибке вызываемый объект обозначается именем, определённым параметром namegv.

OP*  ck_entersub_args_proto_or_list(OP *entersubop, GV *namegv,
                                    SV *protosv)
cv_const_sv

Если cv является константной подпрограммой, подходящей для инлайнинга, возвращает константное значение, возвращаемое подпрограммой. В противном случае возвращает NULL.

Константные подпрограммы могут быть созданы с помощью newCONSTSUB или как описано в "Константные функции" в perlsub.

SV*  cv_const_sv(const CV *const cv)
cv_get_call_checker

Оригинальная форма "cv_get_call_checker_flags", которая не возвращает флаги проверки. При использовании функции проверки, возвращаемой этой функцией, безопасно вызывать её только с истинным GV в качестве аргумента namegv.

void  cv_get_call_checker(CV *cv, Perl_call_checker *ckfun_p,
                          SV **ckobj_p)
cv_get_call_checker_flags

Извлекает функцию, которая будет использоваться для обработки вызова подпрограммы cv. В частности, эта функция применяется к дереву операций entersub для вызова подпрограммы, не помеченной &, где вызываемый объект может быть идентифицирован во время компиляции как cv.

Указатель на функцию на уровне C возвращается в *ckfun_p, аргумент SV для неё возвращается в *ckobj_p, а контрольные флаги возвращаются в *ckflags_p. Функция должна быть вызвана следующим образом:

entersubop = (*ckfun_p)(aTHX_ entersubop, namegv, (*ckobj_p));

В этом вызове entersubop — указатель на операцию entersub, которую может заменить функция проверки, а namegv предоставляет имя, которое должна использовать функция проверки для обозначения вызываемого объекта операции entersub, если ей необходимо сгенерировать какие-либо диагностические сообщения. Разрешается применение функции проверки в нестандартных ситуациях, таких как вызов другой подпрограммы или вызов метода.

namegv может на самом деле не быть GV. Если бит CALL_CHECKER_REQUIRE_GV в *ckflags_p сброшен, разрешается передать CV или другой SV вместо него — всё, что может быть использовано в качестве первого аргумента "cv_name". Если бит CALL_CHECKER_REQUIRE_GV установлен в *ckflags_p, то функция проверки требует, чтобы namegv был истинным GV.

По умолчанию функция проверки — Perl_ck_entersub_args_proto_or_list, параметр SV — cv сам, а флаг CALL_CHECKER_REQUIRE_GV сброшен. Это реализует стандартную обработку прототипов. Она может быть изменена для определённой подпрограммы с помощью "cv_set_call_checker_flags".

Если бит CALL_CHECKER_REQUIRE_GV установлен в gflags, это указывает, что вызывающая сторона знает только о версии namegv как истинного GV, и соответственно соответствующий бит всегда будет установлен в *ckflags_p, независимо от требований функции проверки. Если бит CALL_CHECKER_REQUIRE_GV сброшен в gflags, это указывает, что вызывающая сторона знает о возможности передачи чего-то кроме GV в качестве namegv, и соответственно соответствующий бит может быть либо установлен, либо сброшен в *ckflags_p, отражая требования функции проверки.

gflags — набор битов, передаваемый в cv_get_call_checker_flags, в котором только бит CALL_CHECKER_REQUIRE_GV в настоящее время имеет определённое значение (см. выше). Все остальные биты должны быть сброшены.

void  cv_get_call_checker_flags(CV *cv, U32 gflags,
                                Perl_call_checker *ckfun_p,
                                SV **ckobj_p, U32 *ckflags_p)
cv_set_call_checker

Оригинальная форма "cv_set_call_checker_flags", которая передаёт ей флаг CALL_CHECKER_REQUIRE_GV для обратной совместимости. Воздействие этого флага состоит в том, что функция проверки гарантированно получит настоящий GV в качестве аргумента namegv.

void  cv_set_call_checker(CV *cv, Perl_call_checker ckfun,
                          SV *ckobj)
cv_set_call_checker_flags

Устанавливает функцию, которая будет использоваться для обработки вызова подпрограммы cv. В частности, функция применяется к дереву операций entersub для вызова подпрограммы, не помеченной &, где вызываемый объект может быть идентифицирован во время компиляции как cv.

Указатель на функцию на уровне C передаётся в ckfun, аргумент SV для неё передаётся в ckobj, а контрольные флаги передаются в ckflags. Функция должна быть определена следующим образом:

STATIC OP * ckfun(pTHX_ OP *op, GV *namegv, SV *ckobj)

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

entersubop = ckfun(aTHX_ entersubop, namegv, ckobj);

В этом вызове entersubop — указатель на операцию entersub, которую может заменить функция проверки, а namegv предоставляет имя, которое должна использовать функция проверки для обозначения вызываемого объекта операции entersub, если ей необходимо сгенерировать какие-либо диагностические сообщения. Разрешается применение функции проверки в нестандартных ситуациях, таких как вызов другой подпрограммы или вызов метода.

namegv может на самом деле не быть GV. Для повышения эффективности perl может передать CV или другой SV вместо него. Переданное значение может быть использовано в качестве первого аргумента "cv_name". Для того, чтобы perl передал GV, включите CALL_CHECKER_REQUIRE_GV в ckflags.

ckflags — набор битов, в котором только бит CALL_CHECKER_REQUIRE_GV в настоящее время имеет определённое значение (см. выше). Все остальные биты должны быть сброшены.

Текущее значение для определённого CV можно получить с помощью "cv_get_call_checker_flags".

void  cv_set_call_checker_flags(CV *cv, Perl_call_checker ckfun,
                                SV *ckobj, U32 ckflags)
LINKLIST

Учитывая корень дерева операций, соедините дерево в порядке выполнения, используя указатели op_next, и верните первую выполненную операцию. Если это уже было сделано, повторное выполнение не будет производиться, и будет возвращено значение o->op_next. Если o->op_next ещё не установлено, o должен быть, по крайней мере, UNOP.

OP*  LINKLIST(OP *o)
LISTOP

Описано в perlguts.

LOGOP

Описано в perlguts.

LOOP

Описано в perlguts.

newASSIGNOP

Создаёт, проверяет и возвращает операцию присваивания. left и right предоставляют параметры присваивания; они потребляются этой функцией и становятся частью созданного дерева операций.

Если optype равно OP_ANDASSIGN, OP_ORASSIGN, или OP_DORASSIGN, тогда строится соответствующее условное дерево операций. Если optype — код операции бинарного оператора, такого как OP_BIT_OR, тогда строится операция, выполняющая бинарную операцию и присваивающая результат левому аргументу. В любом случае, если optype не равно нулю, flags не имеет эффекта.

Если optype равно нулю, тогда строится простое скалярное или списочное присваивание. Тип присваивания определяется автоматически. flags предоставляет восемь битов op_flags, за исключением того, что OPf_KIDS будет установлено автоматически, и, сдвинутое влево на восемь битов, восемь битов op_private, за исключением того, что бит со значением 1 или 2 устанавливается автоматически, как требуется.

OP*  newASSIGNOP(I32 flags, OP* left, I32 optype, OP* right)
newATTRSUB

Создаёт Perl-подпрограмму, выполняя при этом ряд дополнительных задач.

Это то же, что и "newATTRSUB_x" в perlintern, с параметром o_is_gv установленным в FALSE. Это означает, что если o равно нулю, новая подпрограмма будет анонимной; в противном случае имя будет получено из o способом, описанным (как и все остальные детали) в "newATTRSUB_x" в perlintern.

CV*  newATTRSUB(I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
newBINOP

Создаёт, проверяет и возвращает оператор любого бинарного типа. type — это код операции. flags предоставляет восемь бит op_flags, за исключением того, что OPf_KIDS будет установлено автоматически, и, сдвинутое влево на восемь бит, восемь бит op_private, за исключением того, что бит со значением 1 или 2 автоматически устанавливается по необходимости. first и last предоставляют до двух операторов, которые будут непосредственными дочерними операторами бинарного оператора; они потребляются этой функцией и становятся частью построенного дерева операторов.

OP*  newBINOP(I32 type, I32 flags, OP* first, OP* last)
newCONDOP

Создаёт, проверяет и возвращает оператор условного выражения (cond_expr) оператора. flags предоставляет восемь бит op_flags, за исключением того, что OPf_KIDS будет установлено автоматически, и, сдвинутое влево на восемь бит, восемь бит op_private, за исключением того, что бит со значением 1 устанавливается автоматически. first предоставляет выражение, выбирающее между двумя ветвями, а trueop и falseop предоставляют эти ветви; они потребляются этой функцией и становятся частью построенного дерева операторов.

OP*  newCONDOP(I32 flags, OP* first, OP* trueop, OP* falseop)
newCONSTSUB

Ведёт себя как "newCONSTSUB_flags", за исключением того, что name завершается нулём, а не имеет заданной длины, и никакие флаги не устанавливаются. (Это означает, что name всегда интерпретируется как Latin-1.)

CV*  newCONSTSUB(HV* stash, const char* name, SV* sv)
newCONSTSUB_flags

Создаёт константную подпрограмму, выполняя также некоторые дополнительные задачи. Скалярная подпрограмма с константным значением подходит для встраивания во время компиляции, а в коде Perl её можно создать с помощью sub FOO () { 123 }. Другие виды константных подпрограмм обрабатываются по-другому.

Подпрограмма будет иметь пустой прототип и игнорировать любые аргументы при вызове. Её константное поведение определяется sv. Если sv равно нулю, подпрограмма вернёт пустой список. Если sv указывает на скаляр, подпрограмма всегда вернёт этот скаляр. Если sv указывает на массив, подпрограмма всегда вернёт список элементов этого массива в контексте списка или количество элементов в массиве в скалярном контексте. Эта функция принимает в собственность одну ссылку на скаляр или массив и обеспечит, что объект будет существовать, пока существует подпрограмма. Если sv указывает на скаляр, то встраивание предполагает, что значение скаляра никогда не изменится, поэтому вызывающая сторона должна гарантировать, что скаляр не будет изменён позднее. Если sv указывает на массив, то такое предположение не делается, поэтому изменение массива или его элементов, по-видимому, безопасно, но поддерживается ли это на самом деле, ещё не определено.

Подпрограмма будет иметь CvFILE, установленное в соответствии с PL_curcop. Другие аспекты подпрограммы останутся в своём состоянии по умолчанию. Вызывающая сторона может изменить подпрограмму после возвращения из этой функции.

Если name равно нулю, подпрограмма будет анонимной, и её CvGV будет ссылаться на __ANON__ глобальную переменную. Если name не равно нулю, подпрограмма будет иметь соответствующее имя, на которое будет ссылаться соответствующая глобальная переменная. name — это строка длиной len байт, задающая имя символа без префикса, в UTF-8, если flags имеет бит SVf_UTF8, и в Latin-1 в противном случае. Имя может быть либо полным, либо коротким. Если имя короткое, то по умолчанию оно находится в хранилище, указанном stash, если оно не равно нулю, или в PL_curstash, если stash равно нулю. Символ всегда добавляется в хранилище, если это необходимо, со смыслом GV_ADDMULTI.

flags не должно иметь установленных битов, кроме SVf_UTF8.

Если уже существует подпрограмма с указанным именем, то новая подпрограмма заменит существующую в глобальной переменной. Может быть выведено предупреждение о повторном определении.

Если у подпрограммы есть одно из нескольких специальных имён, таких как BEGIN или END, то она будет взята соответствующей очередью для автоматического запуска подпрограмм, связанных с этапом. В этом случае соответствующая глобальная переменная не будет содержать подпрограммы, даже если она её содержала раньше. Выполнение подпрограммы, скорее всего, будет пустой операцией, если sv был связанным массивом или вызывающая сторона изменила подпрограмму каким-то интересным образом до её выполнения. В случае BEGIN, обработка является ошибочной: подпрограмма будет выполнена, когда она будет построена только наполовину, и может быть удалена преждевременно, что, возможно, приведёт к сбою.

Ответственность вызывающей стороны заключается в том, чтобы знать, какая из этих ситуаций применима.

CV*  newCONSTSUB_flags(HV* stash, const char* name, STRLEN len,
                       U32 flags, SV* sv)
newDEFEROP

ПРИМЕЧАНИЕ: newDEFEROP является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Создаёт и возвращает оператор отложенного блока, который реализует defer семантику. block дерево операторов потребляется этой функцией и становится частью возвращаемого дерева операторов.

Аргумент flags несёт дополнительные флаги для установки на возвращаемый оператор, включая поле op_private.

OP*  newDEFEROP(I32 flags, OP *block)
newDEFSVOP

Создаёт и возвращает оператор для доступа к $_.

OP*  newDEFSVOP()
newFOROP

Создаёт, проверяет и возвращает дерево операторов, выражающее цикл foreach (итерация по списку значений). Это цикл высокого уровня, со структурой, позволяющей выйти из цикла с помощью last и аналогичных конструкций.

sv необязательно предоставляет переменную(ые), которые будут алиасированы к каждому элементу по очереди; если равно нулю, используется $_. expr предоставляет список значений для итерации. block предоставляет основную часть цикла, а cont необязательно предоставляет блок continue, который работает как вторая половина тела. Все эти входные данные дерева операторов потребляются этой функцией и становятся частью построенного дерева операторов.

flags предоставляет восемь бит op_flags для оператора leaveloop и, сдвинутое влево на восемь бит, восемь бит op_private для оператора leaveloop, за исключением того, что (в обоих случаях) некоторые биты будут установлены автоматически.

OP*  newFOROP(I32 flags, OP* sv, OP* expr, OP* block, OP* cont)
newGIVENOP

Создаёт, проверяет и возвращает дерево операторов, выражающее блок given. cond предоставляет выражение, значение которого будет локально алиасировано к $_, а block предоставляет тело конструкции given; они потребляются этой функцией и становятся частью построенного дерева операторов. defsv_off должно быть нулём (раньше оно идентифицировало слот пады лексической $_).

OP*  newGIVENOP(OP* cond, OP* block, PADOFFSET defsv_off)
newGVOP

Создаёт, проверяет и возвращает оператор любого типа, который включает в себя вложенную ссылку на GV. type — это код операции. flags предоставляет восемь бит op_flags. gv идентифицирует GV, на которую должен ссылаться оператор; вызов этой функции не передаёт никакой ссылки на неё.

OP*  newGVOP(I32 type, I32 flags, GV* gv)
newLISTOP

Создаёт, проверяет и возвращает оператор любого типа списка. type — это код операции. flags предоставляет восемь бит op_flags, за исключением того, что OPf_KIDS будет установлено автоматически, если требуется. first и last предоставляют до двух операторов, которые являются непосредственными дочерними операторами оператора списка; они потребляются этой функцией и становятся частью построенного дерева операторов.

Для большинства операторов списка функция проверки ожидает, что все операторы-потомки уже присутствуют, поэтому вызов newLISTOP(OP_JOIN, ...) (например) не подходит. В этом случае нужно создать оператор типа OP_LIST, добавить к нему больше потомков и затем вызвать "op_convert_list". См. "op_convert_list" для получения дополнительной информации.

OP*  newLISTOP(I32 type, I32 flags, OP* first, OP* last)
newLOGOP

Создаёт, проверяет и возвращает логический (управляющий потоком) оператор. type — это код операции. flags предоставляет восемь бит op_flags, за исключением того, что OPf_KIDS будет установлено автоматически, и, сдвинутое влево на восемь бит, восемь бит op_private, за исключением того, что бит со значением 1 устанавливается автоматически. first предоставляет выражение, управляющее потоком, а other предоставляет альтернажную цепочку операторов; они потребляются этой функцией и становятся частью построенного дерева операторов.

OP*  newLOGOP(I32 optype, I32 flags, OP *first, OP *other)
newLOOPEX

Создаёт, проверяет и возвращает оператор выхода из цикла (такой как goto или last). type — это код операции. label предоставляет параметр, определяющий цель оператора; он потребляется этой функцией и становится частью построенного дерева операторов.

OP*  newLOOPEX(I32 type, OP* label)
newLOOPOP

Создаёт, проверяет и возвращает дерево операторов, выражающее цикл. Это только цикл в потоке управления через дерево операторов; он не имеет структуры цикла высокого уровня, которая позволяет выйти из цикла с помощью last и аналогичных конструкций. flags предоставляет восемь бит op_flags для оператора верхнего уровня, за исключением того, что некоторые биты будут установлены автоматически по необходимости. expr предоставляет выражение, управляющее итерацией цикла, а block предоставляет тело цикла; они потребляются этой функцией и становятся частью построенного дерева операторов. debuggable в настоящее время не используется и должно всегда быть 1.

OP*  newLOOPOP(I32 flags, I32 debuggable, OP* expr, OP* block)
newMETHOP

Создаёт, проверяет и возвращает оператор типа метод с именем метода, вычисляемым во время выполнения. type — это код операции. flags задаёт восемь бит op_flags, за исключением того, что OPf_KIDS будет установлено автоматически, и, сдвинутое влево на восемь бит, восемь бит op_private, за исключением того, что бит со значением 1 автоматически устанавливается. dynamic_meth предоставляет оператор, вычисляющий имя метода; он используется этой функцией и становится частью создаваемого дерева операторов. Поддерживаемые типы операторов: OP_METHOD.

OP*  newMETHOP(I32 type, I32 flags, OP* dynamic_meth)
newMETHOP_named

Создаёт, проверяет и возвращает оператор типа метод с постоянным именем метода. type — это код операции. flags задаёт восемь бит op_flags, а сдвинутое влево на восемь бит, восемь бит op_private. const_meth предоставляет постоянное имя метода; оно должно быть общим строковым значением COW. Поддерживаемые типы операторов: OP_METHOD_NAMED.

OP*  newMETHOP_named(I32 type, I32 flags, SV* const_meth)
newNULLLIST

Создаёт, проверяет и возвращает новый оператор stub, представляющий пустой список выражений.

OP*  newNULLLIST()
newOP

Создаёт, проверяет и возвращает оператор любого базового типа (любого типа без дополнительных полей). type — это код операции. flags задаёт восемь бит op_flags, а сдвинутое влево на восемь бит, восемь бит op_private.

OP*  newOP(I32 optype, I32 flags)
newPADOP

Создаёт, проверяет и возвращает оператор любого типа, включающего ссылку на элемент заполнителя. type — это код операции. flags задаёт восемь бит op_flags. Слот заполнителя автоматически выделяется и заполняется sv; эта функция принимает владение одной ссылкой на него.

Эта функция существует только в том случае, если Perl был скомпилирован с использованием ithreads.

OP*  newPADOP(I32 type, I32 flags, SV* sv)
newPMOP

Создаёт, проверяет и возвращает оператор любого типа сопоставления шаблонов. type — это код операции. flags задаёт восемь бит op_flags, а сдвинутое влево на восемь бит, восемь бит op_private.

OP*  newPMOP(I32 type, I32 flags)
newPVOP

Создаёт, проверяет и возвращает оператор любого типа, включающего встроенный указатель C-уровня (PV). type — это код операции. flags задаёт восемь бит op_flags. pv предоставляет указатель C-уровня. В зависимости от типа оператора, память, на которую ссылается pv, может быть освобождена при уничтожении оператора. Если оператор относится к освобождаемому типу, pv должен быть выделен с помощью PerlMemShared_malloc.

OP*  newPVOP(I32 type, I32 flags, char* pv)
newRANGE

Создаёт и возвращает оператор range, с подчиненными операторами flip и flop. flags задаёт восемь бит op_flags для оператора flip и, сдвинутое влево на восемь бит, восемь бит op_private для операторов flip и range, за исключением того, что бит со значением 1 автоматически устанавливается. left и right предоставляют выражения, определяющие крайние точки диапазона; они потребляются этой функцией и становятся частью создаваемого дерева операторов.

OP*  newRANGE(I32 flags, OP* left, OP* right)
newSLICEOP

Создаёт, проверяет и возвращает оператор lslice (срезы списка). flags задаёт восемь бит op_flags, за исключением того, что OPf_KIDS будет установлено автоматически, а, сдвинутое влево на восемь бит, восемь бит op_private, за исключением того, что бит со значением 1 или 2 устанавливается автоматически, если требуется. listval и subscript задают параметры среза; они потребляются этой функцией и становятся частью создаваемого дерева операторов.

OP*  newSLICEOP(I32 flags, OP* subscript, OP* listop)
newSTATEOP

Создаёт оператор состояния (COP). Оператор состояния обычно является оператором nextstate, но будет оператором dbstate если отладка включена для текущего компилируемого кода. Оператор состояния заполняется из PL_curcop (или PL_compiling). Если label не является нулевым, он предоставляет имя метки для присоединения к оператору состояния; эта функция принимает владение памятью, на которую указывает label, и освободит её. flags задаёт восемь бит op_flags для оператора состояния.

Если o равен нулю, оператор состояния возвращается. В противном случае оператор состояния объединяется с o в оператор списка lineseq, который возвращается. o используется этой функцией и становится частью возвращаемого дерева операторов.

OP*  newSTATEOP(I32 flags, char* label, OP* o)
newSUB

Как "newATTRSUB", но без атрибутов.

CV*  newSUB(I32 floor, OP* o, OP* proto, OP* block)
newSVOP

Создаёт, проверяет и возвращает оператор любого типа, включающего встроенный SV. type — это код операции. flags задаёт восемь бит op_flags. sv предоставляет SV для встраивания в оператор; эта функция принимает владение одной ссылкой на него.

OP*  newSVOP(I32 type, I32 flags, SV* sv)
newTRYCATCHOP

ПРИМЕЧАНИЕ: newTRYCATCHOP является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Создаёт и возвращает оператор условного выполнения, реализующий семантику try/catch. Сначала выполняется дерево операторов в tryblock, внутри контекста, который перехватывает исключения. Если возникает исключение, выполняется дерево операторов в catchblock, с перехваченным исключением, установленным в лексическую переменную, заданную catchvar (которая должна быть оператором типа OP_PADSV). Все деревья операторов потребляются этой функцией и становятся частью возвращаемого дерева операторов.

Аргумент flags в настоящее время игнорируется.

OP*  newTRYCATCHOP(I32 flags, OP* tryblock, OP *catchvar,
                   OP* catchblock)
newUNOP

Создаёт, проверяет и возвращает оператор любого унарного типа. type — это код операции. flags задаёт восемь бит op_flags, за исключением того, что OPf_KIDS будет установлено автоматически, если требуется, и, сдвинутое влево на восемь бит, восемь бит op_private, за исключением того, что бит со значением 1 автоматически устанавливается. first предоставляет необязательный оператор, который будет прямым потомком унарного оператора; он потребляется этой функцией и становится частью создаваемого дерева операторов.

OP*  newUNOP(I32 type, I32 flags, OP* first)
newUNOP_AUX

Аналогично newUNOP, но создаёт структуру UNOP_AUX, с op_aux инициализированным значением aux

OP*  newUNOP_AUX(I32 type, I32 flags, OP* first,
                 UNOP_AUX_item *aux)
newWHENOP

Создаёт, проверяет и возвращает дерево операторов, выражающее блок when. cond предоставляет выражение проверки, а block предоставляет блок, который будет выполнен, если выражение проверки истинно; они потребляются этой функцией и становятся частью создаваемого дерева операторов. cond будет интерпретироваться DWIM-синтаксически, часто как сравнение с $_, и может быть null для создания блока default.

OP*  newWHENOP(OP* cond, OP* block)
newWHILEOP

Создаёт, проверяет и возвращает дерево операторов, выражающее цикл while. Это цикл с большой функциональностью, структура которого позволяет выходить из цикла с помощью last и подобными операторами.

loop — это необязательный предварительно созданный оператор enterloop для использования в цикле; если он равен null, то будет автоматически создан подходящий оператор. expr задаёт управляющее выражение цикла. block задаёт основную часть цикла, а cont необязательно задаёт блок continue, который действует как вторая половина тела. Все эти входные данные дерева операторов потребляются этой функцией и становятся частью создаваемого дерева операторов.

flags задаёт восемь бит op_flags для оператора leaveloop и, сдвинутое влево на восемь бит, восемь бит op_private для оператора leaveloop, за исключением того, что (в обоих случаях) некоторые биты будут установлены автоматически. debuggable в настоящее время не используется и всегда должен быть 1. has_my может быть предоставлен как true для принудительного помещения тела цикла в свой собственный область видимости.

OP*  newWHILEOP(I32 flags, I32 debuggable, LOOP* loop, OP* expr,
                OP* block, OP* cont, I32 has_my)
newXS

Используется xsubpp для подключения XSUB как подпрограмм Perl. filename должен быть статическим хранилищем, поскольку используется непосредственно как CvFILE(), без создания копии.

OA_BASEOP
OA_BINOP
OA_COP
OA_LISTOP
OA_LOGOP
OA_PADOP
OA_PMOP
OA_PVOP_OR_SVOP
OA_SVOP
OA_UNOP
OA_LOOP

Описание в perlguts.

OP

Описание в perlguts.

op_append_elem

Добавляет элемент в список операторов, содержащихся непосредственно в операторе типа список, возвращая расширенный список. first — это оператор типа список, а last — оператор, который нужно добавить в список. optype задаёт предполагаемый код операции для списка. Если first ещё не является списком нужного типа, он будет преобразован. Если first или last равен null, другой возвращается без изменений.

OP*  op_append_elem(I32 optype, OP* first, OP* last)
op_append_list

Конкатенация списков операторов, содержащихся непосредственно в двух операторах типа список, возвращая объединённый список. first и last — это операторы типа список, которые нужно конкатенировать. optype задаёт предполагаемый код операции для списка. Если first или last ещё не является списком нужного типа, он будет преобразован. Если first или last равен null, другой возвращается без изменений.

OP*  op_append_list(I32 optype, OP* first, OP* last)
END_OF_DOCUMENT_MARKER
OP_CLASS

Возвращает класс предоставленного OP: то есть, какую из *OP структур он использует. Для основных операций в настоящее время эта информация извлекается из PL_opargs, что не всегда точно отражает используемый тип; начиная с версии 5.26, также см. функцию "op_class", которая может лучше определить используемый тип.

Для пользовательских операций тип возвращается из регистрации, и регистрируемому элементу необходимо гарантировать его точность. Возвращаемое значение будет одним из OA_* констант из op.h.

U32  OP_CLASS(OP *o)
op_contextualize

Применяет синтаксический контекст к дереву операций, представляющему выражение. o — это дерево операций, а context должно быть G_SCALAR, G_LIST, или G_VOID для указания контекста для применения. Возвращается изменённое дерево операций.

OP*  op_contextualize(OP* o, I32 context)
op_convert_list

Преобразует o в операцию списка, если это не операция списка, а затем преобразует её в указанную type, вызывая её функцию проверки, выделяя целевой объект, если это необходимо, и сворачивая константы.

Операции типа список обычно создаются по одному элементу за раз с помощью newLISTOP, op_prepend_elem и op_append_elem. Затем, наконец, она передаётся в op_convert_list для преобразования в нужный тип.

OP*  op_convert_list(I32 optype, I32 flags, OP* o)
OP_DESC

Возвращает краткое описание предоставленного OP.

const char *  OP_DESC(OP *o)
op_free

Освобождает операцию и её дочерние элементы. Используйте это только тогда, когда операция больше не связана ни с одним деревом операций.

void  op_free(OP* arg)
OpHAS_SIBLING

Возвращает true, если у o есть брат

bool  OpHAS_SIBLING(OP *o)
OpLASTSIB_set

Помечает o как не имеющий дополнительных братьев и помечает o как имеющего указанного родителя. См. также "OpMORESIB_set" и OpMAYBESIB_set. Для интерфейса более высокого уровня см. "op_sibling_splice".

void  OpLASTSIB_set(OP *o, OP *parent)
op_linklist

Эта функция является реализацией макроса "LINKLIST". Не следует вызывать её напрямую.

OP*  op_linklist(OP *o)
op_lvalue

ПРИМЕЧАНИЕ: op_lvalue является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Распространяет контекст lvalue («модифицируемый») на операцию и её дочерние элементы. type представляет тип контекста, примерно на основе типа операции, которая бы производила модификацию, хотя local() представлен как OP_NULL, потому что у него нет собственного типа операции (он сигнализируется флагом в операции lvalue).

Эта функция обнаруживает элементы, которые нельзя изменить, такие как $x+1, и генерирует ошибки для них. Например, $x+1 = 2 привело бы к тому, что она была вызвана с операцией типа OP_ADD и аргументом type значения OP_SASSIGN.

Она также помечает элементы, которые должны вести себя особым образом в контексте lvalue, такие как $$x = 5, которые, возможно, должны оживить ссылку в $x.

OP*  op_lvalue(OP* o, I32 type)
OpMAYBESIB_set

Условно выполняет OpMORESIB_set или OpLASTSIB_set в зависимости от того, является ли sib ненулевым. Для интерфейса более высокого уровня см. "op_sibling_splice".

void  OpMAYBESIB_set(OP *o, OP *sib, OP *parent)
OpMORESIB_set

Устанавливает брата o в ненулевое значение sib. См. также "OpLASTSIB_set" и "OpMAYBESIB_set". Для интерфейса более высокого уровня см. "op_sibling_splice".

void  OpMORESIB_set(OP *o, OP *sib)
OP_NAME

Возвращает имя предоставленного OP. Для основных операций ищет имя из op_type, для пользовательских операций — из op_ppaddr.

const char *  OP_NAME(OP *o)
op_null

Обнуляет операцию, когда она больше не нужна, но всё ещё связана с другими операциями.

void  op_null(OP* o)
op_parent

Возвращает родительскую операцию o, если у неё есть родитель. В противном случае возвращает NULL.

OP*  op_parent(OP *o)
op_prepend_elem

Добавляет элемент в начало списка операций, содержащихся непосредственно в операции типа список, возвращая расширенный список. first — это операция для добавления в начало списка, а last — это операция типа список. optype указывает предполагаемый код операции для списка. Если last ещё не является списком нужного типа, он будет обновлён. Если first или last равно null, возвращается другой элемент без изменений.

OP*  op_prepend_elem(I32 optype, OP* first, OP* last)
op_scope

ПРИМЕЧАНИЕ: op_scope является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Оборачивает дерево операций дополнительными операциями, чтобы во время выполнения создавался динамический контекст. Исходные операции выполняются в новом динамическом контексте, и затем, при нормальном завершении, контекст будет развёрнут. Дополнительные операции, используемые для создания и развёртывания динамического контекста, обычно являются парой enter/leave, но вместо этого может использоваться операция scope, если операции достаточно просты, чтобы не потребовалась полная структура динамического контекста.

OP*  op_scope(OP* o)
OpSIBLING

Возвращает брата o, или NULL если брата нет.

OP*  OpSIBLING(OP *o)
op_sibling_splice

Общая функция для редактирования структуры существующей цепочки узлов op_sibling. По аналогии с функцией splice() на уровне Perl, позволяет удалить ноль или более последовательных узлов, заменив их нулём или более разными узлами. Выполняет необходимые действия по управлению op_first/op_last в родительском узле и манипулирует op_sibling для дочерних элементов. Последний удалённый узел будет помечен как последний узел путём обновления поля op_sibling/op_sibparent или op_moresib, соответственно.

Обратите внимание, что op_next не манипулируется, и узлы не освобождаются; это обязанность вызывающего кода. Он также не создаст новую операцию списка для пустого списка и т. д.; для этого используйте функции более высокого уровня, такие как op_append_elem().

parent — это родительский узел цепочки братьев. Он может быть передан как NULL, если слияние не влияет на первую или последнюю операцию в цепочке.

start — это узел, предшествующий первому узлу, подлежащему слиянию. Узел(ы) за ним будут удалены, а операции будут вставлены после него. Если это NULL, первый узел и далее удаляются, и узлы вставляются в начало.

del_count — количество узлов для удаления. Если ноль, узлы не удаляются. Если -1 или больше, чем количество оставшихся дочерних элементов, все оставшиеся дочерние элементы удаляются.

insert — первый из цепочки узлов, которые должны быть вставлены вместо узлов. Если NULL, узлы не вставляются.

Возвращается начало цепочки удалённых операций или NULL, если операции не были удалены.

Например:

action                    before      after         returns
------                    -----       -----         -------

                          P           P
splice(P, A, 2, X-Y-Z)    |           |             B-C
                          A-B-C-D     A-X-Y-Z-D

                          P           P
splice(P, NULL, 1, X-Y)   |           |             A
                          A-B-C-D     X-Y-B-C-D

                          P           P
splice(P, NULL, 3, NULL)  |           |             A-B-C
                          A-B-C-D     D

                          P           P
splice(P, B, 0, X-Y)      |           |             NULL
                          A-B-C-D     A-B-X-Y-C-D

Для манипулирования более низкого уровня op_sibparent и op_moresib см. "OpMORESIB_set", "OpLASTSIB_set", "OpMAYBESIB_set".

OP*  op_sibling_splice(OP *parent, OP *start, int del_count,
                       OP* insert)
OP_TYPE_IS

Возвращает true, если данный OP не является указателем NULL и если он имеет указанный тип.

Отрицание этого макроса, OP_TYPE_ISNT также доступно, а также OP_TYPE_IS_NN и OP_TYPE_ISNT_NN, которые исключают проверку указателя NULL.

bool  OP_TYPE_IS(OP *o, Optype type)
OP_TYPE_IS_OR_WAS

Возвращает true, если данный OP не является указателем NULL и если он имеет указанный тип или им ранее являлся, прежде чем был заменён OP типа OP_NULL.

Отрицание этого макроса, OP_TYPE_ISNT_AND_WASNT также доступно, а также OP_TYPE_IS_OR_WAS_NN и OP_TYPE_ISNT_AND_WASNT_NN, которые исключают проверку указателя NULL.

bool  OP_TYPE_IS_OR_WAS(OP *o, Optype type)
op_wrap_finally

ПРИМЕЧАНИЕ: op_wrap_finally является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Оборачивает фрагмент дерева операций block в свой собственный блок с областью действия, организуя вызов фрагмента дерева операций finally при выходе из этого блока по любой причине. Оба фрагмента дерева операций потребляются, и результат объединяется и возвращается.

OP*  op_wrap_finally(OP *block, OP *finally)
peep_t

Описано в perlguts.

Perl_cpeep_t

Описано в perlguts.

PL_opfreehook

Если не NULL, функция, указанная этой переменной, будет вызываться каждый раз, когда операция освобождается с соответствующей операцией в качестве аргумента. Это позволяет расширениям освобождать любые дополнительные атрибуты, которые они локально прикрепили к операции. Также гарантируется, что она сначала сработает для родительской операции, а затем для её дочерних элементов.

При замене этой переменной рекомендуется сохранить возможно установленный ранее обработчик, и вызвать его в своём собственном коде.

В многопоточных Perl каждый поток имеет независимую копию этой переменной, каждая инициализируется при создании значением копии создающего потока.

Perl_ophook_t  PL_opfreehook
PL_peepp

Указатель на оптимизатор просмотровых отверстий подпрограммы. Это функция, которая вызывается в конце компиляции Perl-подпрограммы (или, эквивалентно, независимой части Perl-кода) для выполнения корректировок некоторых операций и для выполнения оптимизаций малого масштаба. Функция вызывается один раз для каждой подпрограммы, которая компилируется, и получает в качестве единственного параметра указатель на операцию, которая является точкой входа в подпрограмму. Она изменяет дерево операций на месте.

Оптимизатор просмотровых отверстий никогда не должен заменяться полностью. Вместо этого добавляйте в него код, оборачивая существующий оптимизатор. Основной способ сделать это можно увидеть в "Раздел 3 компиляции: оптимизация просмотрового отверстия" в perlguts. Если новый код хочет работать с операциями на всей структуре подпрограммы, а не только на верхнем уровне, вероятно, будет удобнее обернуть обработчик "PL_rpeepp".

В многопоточных Perl каждый поток имеет независимую копию этой переменной, каждая инициализируется при создании значением копии создающего потока.

peep_t  PL_peepp
PL_rpeepp

Указатель на рекурсивный оптимизатор "дырочных" операций. Это функция, которая вызывается в конце компиляции подпрограммы Perl (или, аналогично, независимого фрагмента кода Perl) для выполнения корректировок некоторых операций и небольших оптимизаций. Функция вызывается один раз для каждой цепочки операций, связанных через поля op_next; она рекурсивно вызывается для обработки каждой побочной цепочки. Ей передаётся, как единственный параметр, указатель на операцию, которая находится в начале цепочки. Она модифицирует дерево операций на месте.

Оптимизатор "дырочных" операций никогда не должен заменяться полностью. Вместо этого добавьте к нему код, обернув существующий оптимизатор. Базовый способ сделать это можно увидеть в "Compile pass 3: peephole optimization" в perlguts. Если новый код хочет работать только с операциями на верхнем уровне подпрограммы, а не по всей структуре, вероятно, будет удобнее обернуть вызов "PL_peepp".

В многопоточных Perl-интерпретаторах у каждого потока есть независимая копия этой переменной; каждая инициализируется во время создания текущим значением копии переменной создающего потока.

peep_t  PL_rpeepp
PMOP

Описание в perlguts.

rv2cv_op_cv

Изучает операцию, которая, как ожидается, идентифицирует подпрограмму во время выполнения, и пытается определить во время компиляции, какую подпрограмму она идентифицирует. Это обычно используется во время компиляции Perl для определения, можно ли применить шаблон к вызову функции. cvop — рассматриваемая операция, обычно операция rv2cv. Указатель на идентифицированную подпрограмму возвращается, если она могла быть статически определена, и возвращается нулевой указатель, если это было невозможно.

В настоящее время подпрограмму можно статически идентифицировать, если RV, на который должна действовать rv2cv, предоставляется подходящей операцией gv или const. Операция gv подходит, если слот CV для GV заполнен. Операция const подходит, если постоянное значение должно быть RV, указывающим на CV. Подробности этого процесса могут измениться в будущих версиях Perl. Если операция rv2cv имеет установленный флаг OPpENTERSUB_AMPER, то попытка статической идентификации подпрограммы не предпринимается: этот флаг используется для подавления магических операций во время компиляции при вызове подпрограммы, заставляя её использовать поведение по умолчанию во время выполнения.

Если flags имеет установленный бит RV2CVOPCV_MARK_EARLY, то обработка ссылки GV изменяется. Если GV был проанализирован и обнаружено, что его слот CV пуст, то операция gv имеет установленный флаг OPpEARLY_CV. Если операция не оптимизирована, и слот CV позже заполняется подпрограммой с шаблоном, этот флаг в конечном итоге вызывает предупреждение "вызов слишком ранний для проверки шаблона".

Если flags имеет установленный бит RV2CVOPCV_RETURN_NAME_GV, то вместо возврата указателя на подпрограмму возвращается указатель на GV, предоставляющий наиболее подходящее имя для подпрограммы в данном контексте. Обычно это просто CvGV подпрограммы, но для анонимной (CvANON) подпрограммы, на которую ссылаются через GV, это будет ссылающийся GV. Результирующий GV* приводится к типу CV* для возврата. Нулевой указатель возвращается как обычно, если статически определяемой подпрограммы нет.

CV*  rv2cv_op_cv(OP *cvop, U32 flags)
UNOP

Описание в perlguts.

XOP

Описание в perlguts.

Упаковщик и распаковщик

pack_cat

DEPRECATED! Планируется удалить pack_cat из будущих выпусков Perl. Не используйте его в новом коде; удалите его из существующего кода.

Интерпретатор, реализующий функцию Perl pack(). Примечание: параметры next_in_list и flags не используются. Этот вызов не следует использовать; используйте "packlist" вместо него.

void  pack_cat(SV *cat, const char *pat, const char *patend,
               SV **beglist, SV **endlist, SV ***next_in_list,
               U32 flags)
packlist

Интерпретатор, реализующий функцию Perl pack().

void  packlist(SV *cat, const char *pat, const char *patend,
               SV **beglist, SV **endlist)
unpack_str

DEPRECATED! Планируется удалить unpack_str из будущих выпусков Perl. Не используйте его в новом коде; удалите его из существующего кода.

Интерпретатор, реализующий функцию Perl unpack(). Примечание: параметры strbeg, new_s и ocnt не используются. Не следует использовать этот вызов, используйте unpackstring вместо него.

SSize_t  unpack_str(const char *pat, const char *patend,
                    const char *s, const char *strbeg,
                    const char *strend, char **new_s, I32 ocnt,
                    U32 flags)
unpackstring

Интерпретатор, реализующий функцию Perl unpack().

Используя шаблон pat..patend, эта функция распаковывает строку s..strend в несколько смертных SVs, которые она помещает в стек аргументов Perl (@_) (поэтому вам нужно выполнить PUTBACK перед и SPAGAIN после вызова этой функции). Она возвращает количество помещённых элементов.

Указатели strend и patend должны указывать на байт, следующий за последним символом каждой строки.

Хотя эта функция возвращает свои значения в стеке аргументов Perl, она не принимает никаких параметров из этого стека (и, следовательно, в частности, нет необходимости выполнять PUSHMARK перед вызовом, в отличие от "call_pv", например).

SSize_t  unpackstring(const char *pat, const char *patend,
                      const char *s, const char *strend,
                      U32 flags)

Структуры данных Pad

CvPADLIST

ПРИМЕЧАНИЕ: CvPADLIST — экспериментальный элемент и может быть изменён или удалён без предварительного уведомления.

CV может иметь CvPADLIST(cv), установленный для указания на PADLIST. Это рабочая область CV, которая хранит лексические переменные, временные значения для операций и значения, специфичные для потока.

Для этих целей "форматы" — это вид CV; eval"" тоже (кроме того, что они не вызываемы по желанию и всегда удаляются после завершения eval""). Файлы, подключённые с помощью require, — это просто eval без внешней лексической области видимости.

У XSUB нет CvPADLIST. dXSTARG извлекает значения из PL_curpad, но это фактически рабочая область вызывающего (слот которой выделяется при каждом entersub). Не получайте и не устанавливайте CvPADLIST для CV, который является XSUB (как определяется CvISXSUB()), слот CvPADLIST в XSUB используется для другой внутренней цели.

PADLIST имеет массив C, где хранятся блоки.

Первый элемент PADLIST — PADNAMELIST, который представляет «имена» или скорее «статическую информацию о типах» для лексических переменных. Отдельные элементы PADNAMELIST — это PADNAME.

Элемент CvDEPTH'th PADLIST — PAD (AV), который является стековой рамкой на этой глубине рекурсии в CV. Ноль-й слот рамки AV — AV, который является @_. Другие элементы служат для хранения переменных и целевых значений операций.

Итерация по PADNAMELIST проходит по всем возможным элементам пада. Слоты пада для целевых значений (SVs_PADTMP) и GV получают имена &PL_padname_undef, а слоты для констант имеют имена &PL_padname_const (см. "pad_alloc"). Использование &PL_padname_undef и &PL_padname_const — деталь реализации, которая может быть изменена. Для проверки используйте !PadnamePV(name) и PadnamePV(name) && !PadnameLEN(name) соответственно.

Только переменные my/our получают действительные имена. Остальные — это целевые значения операций/GV/константы, которые статически выделены или разрешены во время компиляции. Они не имеют имён, с помощью которых они могут быть найдены из кода Perl во время выполнения через eval"", таким образом, как переменные my/our могут быть найдены.

Имена блоков в PADNAMELIST имеют PV, содержащий имя переменной. Поля COP_SEQ_RANGE_LOW и _HIGH образуют диапазон (low+1..high включительно) номеров cop_seq, для которых имя действует. Во время компиляции эти поля могут содержать специальное значение PERL_PADSEQ_INTRO, чтобы указывать различные этапы:

COP_SEQ_RANGE_LOW        _HIGH
-----------------        -----
PERL_PADSEQ_INTRO            0   variable not yet introduced:
                                 { my ($x
valid-seq#   PERL_PADSEQ_INTRO   variable in scope:
                                 { my ($x);
valid-seq#          valid-seq#   compilation of scope complete:
                                 { my ($x); .... }

Когда лексическая переменная ещё не представлена, она уже существует с точки зрения дублирования деклараций, но не для поиска переменных, например:

my ($x, $x); # '"my" variable $x masks earlier declaration'
my $x = $x;  # equal to my $x = $::x;

Для типизированных лексических переменных PadnameTYPE указывает на хэш-таблицу типа. Для our лексических переменных PadnameOURSTASH указывает на хэш-таблицу соответствующей глобальной переменной (чтобы можно было обнаружить дублирующие our объявления в одном пакете). PadnameGEN иногда используется для хранения номера генерации во время компиляции.

Если для имени блока установлен PadnameOUTER, то соответствующий элемент массива AV — это ссылка REFCNT'ed на лексическую переменную «извне». Такие элементы иногда называют «псевдо». В этом случае имя не использует «low» и «high» для хранения диапазона cop_seq, поскольку оно находится в области действия. Вместо этого «high» хранит некоторые флаги, содержащие информацию о реальной лексической переменной (объявлена ли она в анонимном блоке и может ли она быть создана несколько раз?), а для анонимных псевдоэлементов «low» содержит индекс в паде родительского элемента, где хранится значение лексической переменной, для ускорения клонирования.

Если имя является &, соответствующий элемент PAD — это CV, представляющий потенциальное замыкание.

Обратите внимание, что форматы обрабатываются как анонимные подпрограммы и клонируются каждый раз, когда вызывается write (если необходимо).

Флаг SVs_PADSTALE очищается для лексических переменных каждый раз, когда выполняется my(), и устанавливается при выходе из области видимости. Это позволяет генерировать предупреждение "Variable $x is not available" в eval, таких как

{ my $x = 1; sub f { eval '$x'} } f();

Для переменных состояния SVs_PADSTALE перегружено, чтобы означать «ещё не инициализировано», но это внутреннее состояние хранится в отдельном элементе пада.

PADLIST *  CvPADLIST(CV *cv)
pad_add_name_pvs

Точно так же, как "pad_add_name_pvn", но принимает строку-литерал вместо пары «строка/длина».

PADOFFSET  pad_add_name_pvs("name", U32 flags, HV *typestash,
                            HV *ourstash)
PadARRAY

ПРИМЕЧАНИЕ: PadARRAY — экспериментальный элемент и может быть изменён или удалён без предварительного уведомления.

Массив C элементов пада.

SV **  PadARRAY(PAD * pad)
pad_compname_type

DEPRECATED! Планируется удалить pad_compname_type из будущих выпусков Perl. Не используйте его в новом коде; удалите его из существующего кода.

Ищет тип лексической переменной в позиции po в паде, который компилируется в данный момент. Если переменная типизирована, возвращается хэш-таблица класса, к которому она типизирована. Если нет, возвращается NULL.

Вместо этого используйте "PAD_COMPNAME_TYPE" в perlintern.

HV*  pad_compname_type(const PADOFFSET po)
pad_findmy_pvs

Точно так же, как "pad_findmy_pvn", но принимает строку-литерал вместо пары "строка/длина".

PADOFFSET  pad_findmy_pvs("name", U32 flags)
PadlistARRAY

ПРИМЕЧАНИЕ: PadlistARRAY является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Массив C списка падов, содержащий сами пады. Используйте индексы >= 1, так как элемент с индексом 0 может быть недоступен.

PAD **  PadlistARRAY(PADLIST * padlist)
PadlistMAX

ПРИМЕЧАНИЕ: PadlistMAX является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Индекс последнего выделенного места в списке падов. Обратите внимание, что последний пад может находиться в более раннем слоте. Любые записи после него в этом случае будут NULL.

SSize_t  PadlistMAX(PADLIST * padlist)
PadlistNAMES

ПРИМЕЧАНИЕ: PadlistNAMES является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Имена, связанные с записями падов.

PADNAMELIST *  PadlistNAMES(PADLIST * padlist)
PadlistNAMESARRAY

ПРИМЕЧАНИЕ: PadlistNAMESARRAY является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Массив C имён падов.

PADNAME **  PadlistNAMESARRAY(PADLIST * padlist)
PadlistNAMESMAX

ПРИМЕЧАНИЕ: PadlistNAMESMAX является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Индекс последнего имени пада.

SSize_t  PadlistNAMESMAX(PADLIST * padlist)
PadlistREFCNT

ПРИМЕЧАНИЕ: PadlistREFCNT является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Счётчик ссылок списка падов. В настоящее время он всегда равен 1.

U32  PadlistREFCNT(PADLIST * padlist)
PadMAX

ПРИМЕЧАНИЕ: PadMAX является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Индекс последней записи пада.

SSize_t  PadMAX(PAD * pad)
PadnameLEN

ПРИМЕЧАНИЕ: PadnameLEN является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Длина имени.

STRLEN  PadnameLEN(PADNAME * pn)
PadnamelistARRAY

ПРИМЕЧАНИЕ: PadnamelistARRAY является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Массив C имён падов.

PADNAME **  PadnamelistARRAY(PADNAMELIST * pnl)
PadnamelistMAX

ПРИМЕЧАНИЕ: PadnamelistMAX является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Индекс последнего имени пада.

SSize_t  PadnamelistMAX(PADNAMELIST * pnl)
PadnamelistREFCNT

ПРИМЕЧАНИЕ: PadnamelistREFCNT является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Счётчик ссылок списка имён падов.

SSize_t  PadnamelistREFCNT(PADNAMELIST * pnl)
PadnamelistREFCNT_dec

ПРИМЕЧАНИЕ: PadnamelistREFCNT_dec является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Уменьшает счётчик ссылок списка имён падов.

void  PadnamelistREFCNT_dec(PADNAMELIST * pnl)
PadnamePV

ПРИМЕЧАНИЕ: PadnamePV является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Имя, хранящееся в структуре имени пада. Возвращает NULL для целевого слота.

char *  PadnamePV(PADNAME * pn)
PadnameREFCNT

ПРИМЕЧАНИЕ: PadnameREFCNT является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Счётчик ссылок имени пада.

SSize_t  PadnameREFCNT(PADNAME * pn)
PadnameREFCNT_dec

ПРИМЕЧАНИЕ: PadnameREFCNT_dec является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Уменьшает счётчик ссылок имени пада.

void  PadnameREFCNT_dec(PADNAME * pn)
PadnameSV

ПРИМЕЧАНИЕ: PadnameSV является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Возвращает имя пада как временный SV.

SV *  PadnameSV(PADNAME * pn)
PadnameUTF8

ПРИМЕЧАНИЕ: PadnameUTF8 является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Указывает, находится ли PadnamePV в кодировке UTF-8. В настоящее время это всегда верно.

bool  PadnameUTF8(PADNAME * pn)
pad_new

Создаёт новый список падов, обновляя глобальные переменные, указывающие на текущий компилируемый список падов. Следующие флаги могут быть объединены с помощью оператора OR:

padnew_CLONE        this pad is for a cloned CV
padnew_SAVE         save old globals on the save stack
padnew_SAVESUB      also save extra stuff for start of sub
PADLIST*  pad_new(int flags)
PL_comppad

ПРИМЕЧАНИЕ: PL_comppad является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Во время компиляции указывает на массив, содержащий значения части пада для текущего компилируемого кода. (Во время выполнения CV может иметь множество таких массивов значений; во время компиляции строится только один). Во время выполнения указывает на массив, содержащий текущие релевантные значения для пада для текущего выполняемого кода.

PL_comppad_name

ПРИМЕЧАНИЕ: PL_comppad_name является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Во время компиляции указывает на массив, содержащий имена части пада для текущего компилируемого кода.

PL_curpad

ПРИМЕЧАНИЕ: PL_curpad является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Указывает напрямую на тело массива "PL_comppad". (То есть, это PadARRAY(PL_comppad).)

SVs_PADMY

DEPRECATED! Планируется удалить SVs_PADMY из будущей версии Perl. Не используйте его для нового кода; удалите его из существующего кода.

Описано в perlguts.

SVs_PADTMP

Описано в perlguts.

Доступ к паролям и группам

GRPASSWD

Если этот символ определён, программа C понимает, что struct group в grp.h содержит gr_passwd.

HAS_ENDGRENT

Если этот символ определён, это означает, что функция getgrent доступна для завершения последовательного доступа к базе данных групп.

HAS_ENDGRENT_R

Если этот символ определён, это означает, что функция endgrent_r доступна для безопасного завершения getgrent.

HAS_ENDPWENT

Если этот символ определён, это означает, что функция endpwent доступна для завершения последовательного доступа к базе данных паролей.

HAS_ENDPWENT_R

Если этот символ определён, это означает, что функция endpwent_r доступна для безопасного завершения endpwent.

HAS_GETGRENT

Если этот символ определён, это означает, что функция getgrent доступна для последовательного доступа к базе данных групп.

HAS_GETGRENT_R

Если этот символ определён, это означает, что функция getgrent_r доступна для безопасного доступа к базе данных групп.

HAS_GETPWENT

Если этот символ определён, это означает, что функция getpwent доступна для последовательного доступа к базе данных паролей. Если она недоступна, может быть доступна более старая функция getpw().

HAS_GETPWENT_R

Если этот символ определён, это означает, что функция getpwent_r доступна для безопасного доступа к базе данных паролей.

HAS_SETGRENT

Если этот символ определён, это означает, что функция setgrent доступна для инициализации последовательного доступа к базе данных групп.

HAS_SETGRENT_R

Если этот символ определён, это означает, что функция setgrent_r доступна для безопасной инициализации setgrent.

HAS_SETPWENT

Если этот символ определён, это означает, что функция setpwent доступна для инициализации последовательного доступа к базе данных паролей.

HAS_SETPWENT_R

Если этот символ определён, это означает, что функция setpwent_r доступна для безопасной инициализации setpwent.

PWAGE

Если этот символ определён, программа C понимает, что struct passwd содержит pw_age.

PWCHANGE

Если этот символ определён, программа C понимает, что struct passwd содержит pw_change.

PWCLASS

Если этот символ определён, программа C понимает, что struct passwd содержит pw_class.

PWCOMMENT

Если этот символ определён, программа C понимает, что struct passwd содержит pw_comment.

PWEXPIRE

Если этот символ определён, программа C понимает, что struct passwd содержит pw_expire.

PWGECOS

Если этот символ определён, программа C понимает, что struct passwd содержит pw_gecos.

PWPASSWD

Если этот символ определён, программа C понимает, что struct passwd содержит pw_passwd.

PWQUOTA

Если этот символ определён, программа C понимает, что struct passwd содержит pw_quota.

Пути к системным командам

CSH

Если этот символ определён, он содержит полный путь к csh.

LOC_SED

Этот символ содержит полный путь к программе sed.

SH_PATH

Этот символ содержит полный путь к оболочке, используемой в этой системе для выполнения скриптов Bourne Shell. Обычно это /bin/sh, но возможны и другие варианты: /bin/ksh, /bin/pdksh, /bin/ash, /bin/bash или что-то вроде D:/bin/sh.exe.

Информация о прототипах

CRYPT_R_PROTO

Этот символ кодирует прототип crypt_r. Он равен нулю, если d_crypt_r не определён, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_crypt_r определён.

CTERMID_R_PROTO

Этот символ кодирует прототип ctermid_r. Он равен нулю, если d_ctermid_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_ctermid_r определено.

DRAND48_R_PROTO

Этот символ кодирует прототип drand48_r. Он равен нулю, если d_drand48_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_drand48_r определено.

ENDGRENT_R_PROTO

Этот символ кодирует прототип endgrent_r. Он равен нулю, если d_endgrent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_endgrent_r определено.

ENDHOSTENT_R_PROTO

Этот символ кодирует прототип endhostent_r. Он равен нулю, если d_endhostent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_endhostent_r определено.

ENDNETENT_R_PROTO

Этот символ кодирует прототип endnetent_r. Он равен нулю, если d_endnetent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_endnetent_r определено.

ENDPROTOENT_R_PROTO

Этот символ кодирует прототип endprotoent_r. Он равен нулю, если d_endprotoent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_endprotoent_r определено.

ENDPWENT_R_PROTO

Этот символ кодирует прототип endpwent_r. Он равен нулю, если d_endpwent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_endpwent_r определено.

ENDSERVENT_R_PROTO

Этот символ кодирует прототип endservent_r. Он равен нулю, если d_endservent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_endservent_r определено.

GDBMNDBM_H_USES_PROTOTYPES

Если этот символ определён, это означает, что gdbm/ndbm.h использует реальные ANSI C прототипы вместо функций в стиле K&R без информации о параметрах. В то время как ANSI C прототипы поддерживаются в C++, функции в стиле K&R приведут к ошибкам.

GDBM_NDBM_H_USES_PROTOTYPES

Если этот символ определён, это означает, что <gdbm-ndbm.h> использует реальные ANSI C прототипы вместо функций в стиле K&R без информации о параметрах. В то время как ANSI C прототипы поддерживаются в C++, функции в стиле K&R приведут к ошибкам.

GETGRENT_R_PROTO

Этот символ кодирует прототип getgrent_r. Он равен нулю, если d_getgrent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_getgrent_r определено.

GETGRGID_R_PROTO

Этот символ кодирует прототип getgrgid_r. Он равен нулю, если d_getgrgid_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_getgrgid_r определено.

GETGRNAM_R_PROTO

Этот символ кодирует прототип getgrnam_r. Он равен нулю, если d_getgrnam_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_getgrnam_r определено.

GETHOSTBYADDR_R_PROTO

Этот символ кодирует прототип gethostbyaddr_r. Он равен нулю, если d_gethostbyaddr_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_gethostbyaddr_r определено.

GETHOSTBYNAME_R_PROTO

Этот символ кодирует прототип gethostbyname_r. Он равен нулю, если d_gethostbyname_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_gethostbyname_r определено.

GETHOSTENT_R_PROTO

Этот символ кодирует прототип gethostent_r. Он равен нулю, если d_gethostent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_gethostent_r определено.

GETLOGIN_R_PROTO

Этот символ кодирует прототип getlogin_r. Он равен нулю, если d_getlogin_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_getlogin_r определено.

GETNETBYADDR_R_PROTO

Этот символ кодирует прототип getnetbyaddr_r. Он равен нулю, если d_getnetbyaddr_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_getnetbyaddr_r определено.

GETNETBYNAME_R_PROTO

Этот символ кодирует прототип getnetbyname_r. Он равен нулю, если d_getnetbyname_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_getnetbyname_r определено.

GETNETENT_R_PROTO

Этот символ кодирует прототип getnetent_r. Он равен нулю, если d_getnetent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_getnetent_r определено.

GETPROTOBYNAME_R_PROTO

Этот символ кодирует прототип getprotobyname_r. Он равен нулю, если d_getprotobyname_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_getprotobyname_r определено.

GETPROTOBYNUMBER_R_PROTO

Этот символ кодирует прототип getprotobynumber_r. Он равен нулю, если d_getprotobynumber_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_getprotobynumber_r определено.

GETPROTOENT_R_PROTO

Этот символ кодирует прототип getprotoent_r. Он равен нулю, если d_getprotoent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_getprotoent_r определено.

GETPWENT_R_PROTO

Этот символ кодирует прототип getpwent_r. Он равен нулю, если d_getpwent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_getpwent_r определено.

GETPWNAM_R_PROTO

Этот символ кодирует прототип getpwnam_r. Он равен нулю, если d_getpwnam_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_getpwnam_r определено.

GETPWUID_R_PROTO

Этот символ кодирует прототип getpwuid_r. Он равен нулю, если d_getpwuid_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_getpwuid_r определено.

GETSERVBYNAME_R_PROTO

Этот символ кодирует прототип getservbyname_r. Он равен нулю, если d_getservbyname_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_getservbyname_r определено.

GETSERVBYPORT_R_PROTO

Этот символ кодирует прототип getservbyport_r. Он равен нулю, если d_getservbyport_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_getservbyport_r определено.

GETSERVENT_R_PROTO

Этот символ кодирует прототип getservent_r. Он равен нулю, если d_getservent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_getservent_r определено.

GETSPNAM_R_PROTO

Этот символ кодирует прототип getspnam_r. Он равен нулю, если d_getspnam_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_getspnam_r определено.

HAS_DBMINIT_PROTO

Если этот символ определён, это означает, что система предоставляет прототип для функции dbminit(). В противном случае это зависит от программы. Хорошее предположение —

extern int dbminit(char *);
HAS_DRAND48_PROTO

Если этот символ определён, это означает, что система предоставляет прототип для функции drand48(). В противном случае это зависит от программы. Хорошее предположение —

extern double drand48(void);
HAS_FLOCK_PROTO

Если этот символ определён, это означает, что система предоставляет прототип для функции flock(). В противном случае это зависит от программы. Хорошее предположение —

extern int flock(int, int);
HAS_GETHOST_PROTOS

Если этот символ определён, это означает, что netdb.h включает прототипы для gethostent(), gethostbyname(), и gethostbyaddr(). В противном случае это зависит от программы. См. netdbtype.U (часть metaconfig) для проверки различных типов Netdb_xxx_t.

HAS_GETNET_PROTOS

Если этот символ определён, это означает, что netdb.h включает прототипы для getnetent(), getnetbyname(), и getnetbyaddr(). В противном случае это зависит от программы. См. netdbtype.U (часть metaconfig) для проверки различных типов Netdb_xxx_t.

HAS_GETPROTO_PROTOS

Если этот символ определён, это означает, что netdb.h включает прототипы для getprotoent(), getprotobyname(), и getprotobyaddr(). В противном случае это зависит от программы. См. netdbtype.U (часть metaconfig) для проверки различных типов Netdb_xxx_t.

HAS_GETSERV_PROTOS

Если этот символ определён, это означает, что netdb.h включает прототипы для getservent(), getservbyname(), и getservbyaddr(). В противном случае это зависит от программы. См. netdbtype.U (часть metaconfig) для проверки различных типов Netdb_xxx_t.

HAS_MODFL_PROTO

Если этот символ определён, это означает, что система предоставляет прототип для функции modfl(). В противном случае это зависит от программы.

HAS_SBRK_PROTO

Если этот символ определён, это означает, что система предоставляет прототип для функции sbrk(). В противном случае это зависит от программы. Хорошие предположения —

extern void* sbrk(int);
extern void* sbrk(size_t);
END_OF_DOCUMENT_MARKER
HAS_SETRESGID_PROTO

Этот символ, если определён, указывает, что система предоставляет прототип для функции setresgid(). В противном случае, прототип должен предоставить программа. Хорошие предположения —

extern int setresgid(uid_t ruid, uid_t euid, uid_t suid);
HAS_SETRESUID_PROTO

Этот символ, если определён, указывает, что система предоставляет прототип для функции setresuid(). В противном случае, прототип должен предоставить программа. Хорошие предположения —

extern int setresuid(uid_t ruid, uid_t euid, uid_t suid);
HAS_SHMAT_PROTOTYPE

Этот символ, если определён, указывает, что sys/shm.h содержит прототип для shmat(). В противном случае, прототип должен предложить программа. Shmat_t shmat(int, Shmat_t, int) — хорошее предположение, но не всегда верное, поэтому его следует генерировать программой только в том случае, когда HAS_SHMAT_PROTOTYPE не определён, чтобы избежать конфликтов.

HAS_SOCKATMARK_PROTO

Этот символ, если определён, указывает, что система предоставляет прототип для функции sockatmark(). В противном случае, прототип должен предоставить программа. Хорошее предположение —

extern int sockatmark(int);
HAS_SYSCALL_PROTO

Этот символ, если определён, указывает, что система предоставляет прототип для функции syscall(). В противном случае, прототип должен предоставить программа. Хорошие предположения —

extern int syscall(int,  ...);
extern int syscall(long, ...);
HAS_TELLDIR_PROTO

Этот символ, если определён, указывает, что система предоставляет прототип для функции telldir(). В противном случае, прототип должен предоставить программа. Хорошее предположение —

extern long telldir(DIR*);
NDBM_H_USES_PROTOTYPES

Этот символ, если определён, указывает, что ndbm.h использует реальные ANSI C прототипы вместо функций в стиле K&R без информации о параметрах. Хотя прототипы ANSI C поддерживаются в C++, функции в стиле K&R приведут к ошибкам.

RANDOM_R_PROTO

Этот символ кодирует прототип random_r. Он равен нулю, если d_random_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_random_r определено.

READDIR_R_PROTO

Этот символ кодирует прототип readdir_r. Он равен нулю, если d_readdir_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_readdir_r определено.

SETGRENT_R_PROTO

Этот символ кодирует прототип setgrent_r. Он равен нулю, если d_setgrent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_setgrent_r определено.

SETHOSTENT_R_PROTO

Этот символ кодирует прототип sethostent_r. Он равен нулю, если d_sethostent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_sethostent_r определено.

SETLOCALE_R_PROTO

Этот символ кодирует прототип setlocale_r. Он равен нулю, если d_setlocale_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_setlocale_r определено.

SETNETENT_R_PROTO

Этот символ кодирует прототип setnetent_r. Он равен нулю, если d_setnetent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_setnetent_r определено.

SETPROTOENT_R_PROTO

Этот символ кодирует прототип setprotoent_r. Он равен нулю, если d_setprotoent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_setprotoent_r определено.

SETPWENT_R_PROTO

Этот символ кодирует прототип setpwent_r. Он равен нулю, если d_setpwent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_setpwent_r определено.

SETSERVENT_R_PROTO

Этот символ кодирует прототип setservent_r. Он равен нулю, если d_setservent_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_setservent_r определено.

SRAND48_R_PROTO

Этот символ кодирует прототип srand48_r. Он равен нулю, если d_srand48_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_srand48_r определено.

SRANDOM_R_PROTO

Этот символ кодирует прототип srandom_r. Он равен нулю, если d_srandom_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_srandom_r определено.

STRERROR_R_PROTO

Этот символ кодирует прототип strerror_r. Он равен нулю, если d_strerror_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_strerror_r определено.

TMPNAM_R_PROTO

Этот символ кодирует прототип tmpnam_r. Он равен нулю, если d_tmpnam_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_tmpnam_r определено.

TTYNAME_R_PROTO

Этот символ кодирует прототип ttyname_r. Он равен нулю, если d_ttyname_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_ttyname_r определено.

Функции REGEXP

pregcomp

Описание в perlreguts.

REGEXP*  pregcomp(SV * const pattern, const U32 flags)
pregexec

Описание в perlreguts.

I32  pregexec(REGEXP * const prog, char* stringarg, char* strend,
              char* strbeg, SSize_t minend, SV* screamer,
              U32 nosave)
re_compile

Компилирует шаблон регулярного выражения pattern, возвращая указатель на скомпилированный объект для последующего сопоставления с внутренним движком регулярных выражений.

Эта функция обычно используется пользовательским движком регулярных выражений .comp() для передачи тем шаблонам, которые он не хочет обрабатывать сам (как правило, передавая те же флаги, с которыми он был вызван). Во всех остальных случаях, регулярное выражение должно быть скомпилировано вызовом "pregcomp" для компиляции с использованием текущего активного движка регулярных выражений.

Если pattern уже является REGEXP, эта функция ничего не делает, кроме возвращения указателя на входные данные. В противном случае, PV извлекается и обрабатывается как строка, представляющая шаблон. См. perlre.

Возможные флаги для rx_flags документированы в perlreapi. Все их имена начинаются с RXf_.

REGEXP*  re_compile(SV * const pattern, U32 orig_rx_flags)
re_dup_guts

Дублирование регулярного выражения.

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

После дублирования всех данных ядра, хранящихся в структуре regexp, используется метод regexp_engine.dupe для копирования любых частных данных, хранящихся в указателе *pprivate. Это позволяет расширениям обрабатывать любые необходимые дублирования.

void  re_dup_guts(const REGEXP *sstr, REGEXP *dstr,
                  CLONE_PARAMS* param)
REGEX_LOCALE_CHARSET

Описание в perlreapi.

REGEXP

Описание в perlreapi.

regexp_engine

При компиляции регулярного выражения его поле engine устанавливается в соответствующую структуру, чтобы Perl мог найти нужные функции при использовании.

Для установки нового обработчика регулярных выражений $^H{regcomp} устанавливается в целое число, которое (при соответствующем преобразовании типа) приводит к одной из этих структур. При компиляции выполняется метод comp, и ожидается, что поле engine в полученной структуре regexp будет указывать на ту же структуру.

Символ pTHX_ в определении — макрос, используемый Perl в многопоточном режиме, чтобы добавить дополнительный аргумент к функции, содержащей указатель на интерпретатор, выполняющий регулярное выражение. Поэтому в многопоточном режиме все функции получают дополнительный аргумент.

regexp_paren_pair

Описание в perlreapi.

regmatch_info

Некоторая базовая информация о текущем совпадении, созданная Perl_regexec_flags и переданная в regtry(), regmatch() и т. д. Она выделяется как локальная переменная в стеке, поэтому в ней ничего не должно храниться, что требует сохранения или очистки при croak(). Для этого см. члены aux_info и aux_info_eval объединения regmatch_state.

REXEC_COPY_STR
REXEC_COPY_SKIP_PRE
REXEC_COPY_SKIP_POST

Описание в perlreapi.

RXapif_CLEAR
RXapif_DELETE
RXapif_EXISTS
RXapif_FETCH
RXapif_FIRSTKEY
RXapif_NEXTKEY
RXapif_SCALAR
RXapif_STORE
RXapif_ALL
RXapif_ONE
RXapif_REGNAME
RXapif_REGNAMES
RXapif_REGNAMES_COUNT

Описание в perlreapi.

RX_BUFF_IDX_CARET_FULLMATCH
RX_BUFF_IDX_CARET_POSTMATCH
RX_BUFF_IDX_CARET_PREMATCH
RX_BUFF_IDX_FULLMATCH
RX_BUFF_IDX_POSTMATCH
RX_BUFF_IDX_PREMATCH

Описание в perlreapi.

RXf_PMf_MULTILINE
RXf_PMf_SINGLELINE
RXf_PMf_FOLD
RXf_PMf_EXTENDED
RXf_PMf_KEEPCOPY

Описание в perlreapi.

RXf_SPLIT
RXf_SKIPWHITE
RXf_START_ONLY
RXf_WHITE
RXf_NULL
RXf_NO_INPLACE_SUBST

Описание в perlreapi.

RX_MATCH_COPIED

Описание в perlreapi.

RX_MATCH_COPIED(const REGEXP * rx)
RX_OFFS

Описание в perlreapi.

RX_OFFS(const REGEXP * rx_sv)
SvRX

Удобный макрос для получения REGEXP из SV. Примерно эквивалентен следующему фрагменту:

if (SvMAGICAL(sv))
    mg_get(sv);
if (SvROK(sv))
    sv = MUTABLE_SV(SvRV(sv));
if (SvTYPE(sv) == SVt_REGEXP)
    return (REGEXP*) sv;

Если REGEXP* не найден, будет возвращено NULL.

REGEXP *  SvRX(SV *sv)
SvRXOK

Возвращает булево значение, указывающее, является ли SV (или тот, на который он ссылается) REGEXP.

Если вы хотите что-то сделать с REGEXP* позже, используйте SvRX и проверяйте на NULL.

bool  SvRXOK(SV* sv)
SV_SAVED_COPY

Описание в perlreapi.

Отчёты и форматы

Используются в простом функционале генерации отчётов Perl. См. perlform.

IoBOTTOM_GV

Описание в perlguts.

GV *  IoBOTTOM_GV(IO *io)
IoBOTTOM_NAME

Описание в perlguts.

char *  IoBOTTOM_NAME(IO *io)
IoFMT_GV

Описание в perlguts.

GV *  IoFMT_GV(IO *io)
IoFMT_NAME

Описание в perlguts.

char *  IoFMT_NAME(IO *io)
IoLINES

Описание в perlguts.

IV  IoLINES(IO *io)
IoLINES_LEFT

Описание в perlguts.

IV  IoLINES_LEFT(IO *io)
IoPAGE

Описание в perlguts.

IV  IoPAGE(IO *io)
IoPAGE_LEN

Описание в perlguts.

IV  IoPAGE_LEN(IO *io)
IoTOP_GV

Описание в perlguts.

GV *  IoTOP_GV(IO *io)
IoTOP_NAME

Описание в perlguts.

char *  IoTOP_NAME(IO *io)

Сигналы

HAS_SIGINFO_SI_ADDR

Если этот символ определён, значит siginfo_t имеет член si_addr

HAS_SIGINFO_SI_BAND

Если этот символ определён, значит siginfo_t имеет член si_band

HAS_SIGINFO_SI_ERRNO

Если этот символ определён, значит siginfo_t имеет член si_errno

HAS_SIGINFO_SI_PID

Если этот символ определён, значит siginfo_t имеет член si_pid

HAS_SIGINFO_SI_STATUS

Если этот символ определён, значит siginfo_t имеет член si_status

HAS_SIGINFO_SI_UID

Если этот символ определён, значит siginfo_t имеет член si_uid

HAS_SIGINFO_SI_VALUE

Если этот символ определён, значит siginfo_t имеет член si_value

PERL_SIGNALS_UNSAFE_FLAG

Если этот бит в PL_signals установлен, система использует небезопасные сигналы до Perl 5.8. См. "PERL_SIGNALS" в perlrun и "Отложенные сигналы (Безопасные сигналы)" в perlipc.

U32  PERL_SIGNALS_UNSAFE_FLAG
rsignal

Обёртка над функциями C-библиотеки sigaction(2) или signal(2). Используйте вместо них, так как Perl-версия обеспечивает самую безопасную реализацию и знает аспекты взаимодействия с остальной частью интерпретатора Perl.

Sighandler_t  rsignal(int i, Sighandler_t t)
rsignal_state

Возвращает текущую обработку сигнала для сигнала signo. См. "rsignal".

Sighandler_t  rsignal_state(int i)
Sigjmp_buf

Тип буфера, используемого с Sigsetjmp и Siglongjmp.

Siglongjmp

Этот макрос используется так же, как и siglongjmp(), но вызовет традиционный longjmp() если siglongjmp недоступен. См. "HAS_SIGSETJMP".

void  Siglongjmp(jmp_buf env, int val)
SIG_NAME

Этот символ содержит список имён сигналов в порядке их номеров. Предназначен для инициализации статического массива, например так:

char *sig_name[] = { SIG_NAME };

Сигналы в списке разделены запятыми, а каждое имя сигнала заключено в двойные кавычки. В имени сигнала нет ведущих SIG, т.е. SIGQUIT известно как "QUIT". Пропуски в номерах сигналов (до NSIG) заполняются NUMnn, и т.д., где nn - фактический номер сигнала (например, NUM37). Номер сигнала для sig_name[i] хранится в sig_num[i]. Последний элемент равен 0, чтобы завершить список с NULL. Это соответствует 0 в конце списка sig_name_init. Обратите внимание, что эта переменная инициализируется из sig_name_init, а не из sig_name (которая не используется).

SIG_NUM

Этот символ содержит список номеров сигналов в том же порядке, что и список SIG_NAME. Подходит для статической инициализации массива, например:

int sig_num[] = { SIG_NUM };

Сигналы в списке разделены запятыми, а индексы в этом списке и списке SIG_NAME соответствуют друг другу, поэтому вы легко можете вычислить имя сигнала по номеру или наоборот ценой небольшого динамического линейного поиска. Повторы разрешены, но перемещаются в конец списка. Номер сигнала, соответствующий sig_name[i] равен sig_number[i]. если (i < NSIG) то sig_number[i] == i. Последний элемент равен 0, что соответствует 0 в конце списка sig_name_init. Обратите внимание, что эта переменная инициализируется из sig_num_init, а не из sig_num (которая не используется).

Sigsetjmp

Этот макрос используется так же, как и sigsetjmp(), но вызовет традиционный setjmp() если sigsetjmp недоступен. См. "HAS_SIGSETJMP".

int  Sigsetjmp(jmp_buf env, int savesigs)
SIG_SIZE

Эта переменная содержит количество элементов массивов SIG_NAME и SIG_NUM, не включая конечный элемент NULL.

whichsig
whichsig_pv
whichsig_pvn
whichsig_sv

Все они преобразуют имя сигнала в соответствующий номер сигнала; возвращают -1, если соответствующий номер не найден.

Они отличаются только источником имени сигнала:

whichsig_pv берёт имя из строки, заканчивающейся NUL, начиная с sig.

whichsig просто другое написание, синоним whichsig_pv.

whichsig_pvn берёт имя из строки, начиная с sig, длиной len байт.

whichsig_sv берёт имя из PV, хранящегося в SV sigsv.

I32  whichsig    (const char* sig)
I32  whichsig_pv (const char* sig)
I32  whichsig_pvn(const char* sig, STRLEN len)
I32  whichsig_sv (SV* sigsv)

Настройка сайта

Эти переменные содержат сведения о местоположении различных библиотек, местах установки и других параметрах установки.

ARCHLIB

Если определена, эта переменная содержит имя каталога, в который пользователь хочет поместить файлы архитектурно-зависимых публичных библиотек для perl5. Чаще всего это локальный каталог, такой как /usr/local/lib. Программы, использующие эту переменную, должны быть готовы к обработке расширения имени файла. Если ARCHLIB совпадает с PRIVLIB, она не определена, так как, предположительно, программа уже ищет PRIVLIB.

ARCHLIB_EXP

Этот символ содержит расширенную ~именем версию ARCHLIB, для использования в программах, которые не готовы к обработке расширений ~ во время выполнения.

ARCHNAME

Этот символ содержит строку, представляющую имя архитектуры. Может использоваться для построения пути к архитектурно-зависимым файлам библиотек, например, в частной библиотеке.

BIN

Этот символ содержит путь к каталогу bin, куда будет установлен пакет. Программа должна быть готова к подстановке ~имен.

BIN_EXP

Этот символ содержит результат расширения имени файла для символа BIN, для программ, которые не хотят обрабатывать это во время выполнения.

INSTALL_USR_BIN_PERL

Если этот символ определён, Perl будет также установлен как /usr/bin/perl.

MULTIARCH

Если этот символ определён, процесс сборки будет создавать двоичные файлы, которые будут использоваться в кроссплатформенной среде. Например, в случае NeXT «fat»-библиотек, содержащих исполняемые файлы для нескольких CPUs.

PERL_INC_VERSION_LIST

Эта переменная задаёт список подкаталогов, по которым perl.c:incpush() и lib/lib.pm автоматически будут искать при добавлении каталогов в @INC, в формате, подходящем для C-строки инициализации. См. запись inc_version_list в Porting/Glossary для получения более подробной информации.

PERL_OTHERLIBDIRS

Эта переменная содержит список путей, разделённых двоеточием, по которым perl-бинарник будет искать дополнительные библиотеки или модули. Эти каталоги будут добавлены в конец @INC. Perl автоматически будет искать подкаталоги, зависящие от версии и архитектуры. См. "PERL_INC_VERSION_LIST" для более подробной информации.

PERL_RELOCATABLE_INC

Если этот символ определён, мы хотим переместить записи в @INC во время выполнения, основываясь на местоположении perl-бинарника.

END_OF_DOCUMENT_MARKER
PERL_TARGETARCH

Этот символ, если определён, указывает целевую архитектуру, для которой Perl был скомпилирован кросс-компиляцией. Не определён, если кросс-компиляция не проводилась.

PERL_USE_DEVEL

Этот символ, если определён, указывает, что Perl был сконфигурирован с -Dusedevel, чтобы включить функции разработки. Это не должно использоваться для производственных сборок.

PERL_VENDORARCH

Если определён, этот символ содержит имя частной библиотеки. Библиотека считается частной в том смысле, что она не обязательно должна находиться в пути выполнения, но должна быть доступна для всех. Она может иметь ~ в начале. Стандартное распределение ничего не поместит в этот каталог. Поставщики, распространяющие perl, могут поместить свои зависящие от архитектуры модули и расширения в этот каталог с

MakeMaker Makefile.PL INSTALLDIRS=vendor

или эквивалентом. Смотрите INSTALL для подробностей.

PERL_VENDORARCH_EXP

Этот символ содержит расширенную версию ~name от PERL_VENDORARCH, которая используется в программах, не готовых к расширению ~ во время выполнения.

PERL_VENDORLIB_EXP

Этот символ содержит расширенную версию ~name от VENDORLIB, которая используется в программах, не готовых к расширению ~ во время выполнения.

PERL_VENDORLIB_STEM

Это определение равно PERL_VENDORLIB_EXP с удалением любого конечного компонента, зависящего от версии. Элементы в inc_version_list (inc_version_list.U (часть метаконфигурации)) могут быть добавлены к этой переменной для создания списка каталогов для поиска.

PRIVLIB

Этот символ содержит имя частной библиотеки для этого пакета. Библиотека считается частной в том смысле, что она не обязательно должна находиться в пути выполнения, но должна быть доступна для всех. Программа должна быть готова к расширению ~.

PRIVLIB_EXP

Этот символ содержит расширенную версию ~name от PRIVLIB, которая используется в программах, не готовых к расширению ~ во время выполнения.

SITEARCH

Этот символ содержит имя частной библиотеки для этого пакета. Библиотека считается частной в том смысле, что она не обязательно должна находиться в пути выполнения, но должна быть доступна для всех. Программа должна быть готова к расширению ~. Стандартное распределение ничего не поместит в этот каталог. После установки perl пользователи могут установить свои собственные локальные зависящие от архитектуры модули в этот каталог с

MakeMaker Makefile.PL

или эквивалентом. Смотрите INSTALL для подробностей.

SITEARCH_EXP

Этот символ содержит расширенную версию ~name от SITEARCH, которая используется в программах, не готовых к расширению ~ во время выполнения.

SITELIB

Этот символ содержит имя частной библиотеки для этого пакета. Библиотека считается частной в том смысле, что она не обязательно должна находиться в пути выполнения, но должна быть доступна для всех. Программа должна быть готова к расширению ~. Стандартное распределение ничего не поместит в этот каталог. После установки perl пользователи могут установить свои собственные локальные независимые от архитектуры модули в этот каталог с

MakeMaker Makefile.PL

или эквивалентом. Смотрите INSTALL для подробностей.

SITELIB_EXP

Этот символ содержит расширенную версию ~name от SITELIB, которая используется в программах, не готовых к расширению ~ во время выполнения.

SITELIB_STEM

Это определение равно SITELIB_EXP с удалением любого конечного компонента, зависящего от версии. Элементы в inc_version_list (inc_version_list.U (часть метаконфигурации)) могут быть добавлены к этой переменной для создания списка каталогов для поиска.

STARTPERL

Эта переменная содержит строку, которая должна быть добавлена перед скриптом perl, чтобы убедиться (по надежде), что он будет выполнен с помощью perl, а не какой-либо оболочкой.

USE_64_BIT_ALL

Если этот символ определён, это указывает, что 64-битные целые числа должны использоваться, если доступны. Если не определён, будут использованы родные целые числа (32 или 64 бита). Используется максимальная возможная 64-битная версия: LP64 или ILP64, что означает, что вы сможете использовать более 2 гигабайт памяти. Этот режим ещё более несовместим с бинарными данными, чем USE_64_BIT_INT. Возможно, вы не сможете запустить получившийся исполняемый файл в 32-битной CPU системе вообще, или вам, возможно, потребуется перезагрузить вашу операционную систему до 64-битного режима.

USE_64_BIT_INT

Если этот символ определён, это указывает, что 64-битные целые числа должны использоваться, если доступны. Если не определён, будут использованы родные целые числа (32 или 64 бита). Используется минимальная возможная 64-битная версия, только достаточно для 64-битных целых чисел в Perl. Это может означать использование, например, "long longs", в то время как ваша память всё ещё может быть ограничена 2 гигабайтами.

USE_BSD_GETPGRP

Если этот символ определён, это указывает, что getpgrp требует одного аргумента, в то время как USG требует ни одного.

USE_BSD_SETPGRP

Если этот символ определён, это указывает, что setpgrp требует двух аргументов, в то время как USG требует ни одного. Также см. "HAS_SETPGID" для интерфейса POSIX.

USE_CPLUSPLUS

Если этот символ определён, это указывает, что компилятор C++ использовался для компиляции Perl и будет использоваться для компиляции расширений.

USE_CROSS_COMPILE

Если этот символ определён, это указывает, что Perl компилируется кросс-компиляцией.

USE_C_BACKTRACE

Если этот символ определён, это указывает, что Perl должен быть скомпилирован с поддержкой backtrace.

USE_DTRACE

Если этот символ определён, это указывает, что Perl должен быть скомпилирован с поддержкой DTrace.

USE_DYNAMIC_LOADING

Если этот символ определён, это указывает, что доступно динамическое подгружение.

USE_FAST_STDIO

Если этот символ определён, это указывает, что Perl должен быть скомпилирован с использованием "fast stdio". По умолчанию определён в Perl 5.8 и ранее, не определён в более поздних версиях.

USE_ITHREADS

Если этот символ определён, это указывает, что Perl должен быть скомпилирован с использованием реализации многопоточности, основанной на интерпретаторе.

USE_KERN_PROC_PATHNAME

Если этот символ определён, это указывает, что мы можем использовать sysctl с KERN_PROC_PATHNAME для получения полного пути к исполняемому файлу и, следовательно, для преобразования $^X в абсолютный путь.

USE_LARGE_FILES

Если этот символ определён, это указывает, что должна быть использована поддержка больших файлов, если она доступна.

USE_LONG_DOUBLE

Если этот символ определён, это указывает, что long doubles должны быть использованы, если доступны.

USE_MORE_BITS

Если этот символ определён, это указывает, что 64-битные интерфейсы и long doubles должны быть использованы, если доступны.

USE_NSGETEXECUTABLEPATH

Если этот символ определён, это указывает, что мы можем использовать _NSGetExecutablePath и realpath для получения полного пути к исполняемому файлу и, следовательно, для преобразования $^X в абсолютный путь.

USE_PERLIO

Если этот символ определён, это указывает, что должна быть использована абстракция PerlIO во всех частях. Если не определён, stdio должен быть использован в полностью обратной совместимой манере.

USE_QUADMATH

Если этот символ определён, это указывает, что должна быть использована библиотека quadmath, если она доступна.

USE_REENTRANT_API

Если этот символ определён, это указывает, что Perl должен попытаться использовать различные _r версии функций библиотеки. Это крайне экспериментально.

USE_SEMCTL_SEMID_DS

Если этот символ определён, это указывает, что struct semid_ds * используется для semctl IPC_STAT.

USE_SEMCTL_SEMUN

Если этот символ определён, это указывает, что union semun используется для semctl IPC_STAT.

USE_SITECUSTOMIZE

Если этот символ определён, это указывает, что должен использоваться sitecustomize.

USE_SOCKS

Если этот символ определён, это указывает, что Perl должен быть скомпилирован с использованием socks.

USE_STAT_BLOCKS

Этот символ определён, если в структуре stat этой системы объявлены st_blksize и st_blocks.

USE_STDIO_BASE

Этот символ определён, если поле _base (или аналогичное) структуры stdio FILE может быть использовано для доступа к буферу stdio для дескриптора файла. Если он определён, тогда макрос FILE_base(fp) также будет определён и должен использоваться для доступа к этому полю. Также макрос FILE_bufsiz(fp) будет определён и должен использоваться для определения количества байт в буфере. USE_STDIO_BASE никогда не будет определён, если USE_STDIO_PTR не определён.

USE_STDIO_PTR

Этот символ определён, если поля _ptr и _cnt (или аналогичные) структуры stdio FILE могут быть использованы для доступа к буферу stdio для дескриптора файла. Если он определён, тогда макросы FILE_ptr(fp) и FILE_cnt(fp) также будут определены и должны использоваться для доступа к этим полям.

USE_STRICT_BY_DEFAULT

Если этот символ определён, он включает дополнительные значения по умолчанию. В настоящее время он только включает неявное strict по умолчанию.

USE_THREADS

Если этот символ определён, это указывает, что Perl должен быть скомпилирован с использованием потоков. В настоящее время это синоним и USE_ITHREADS, но в конечном итоге исходный код должен быть изменён, чтобы использовать это для обозначения реализации многопоточности _any_.

Значения конфигурации сокетов

HAS_SOCKADDR_IN6

Если этот символ определён, это указывает на доступность struct sockaddr_in6;

HAS_SOCKADDR_SA_LEN

Если этот символ определён, это указывает, что структура struct sockaddr имеет член, называемый sa_len, указывающий длину структуры.

END_OF_DOCUMENT_MARKER
HAS_SOCKADDR_STORAGE

Этот символ, если определён, указывает на доступность struct sockaddr_storage;

HAS_SOCKATMARK

Этот символ, если определён, указывает, что процедура sockatmark доступна для проверки, находится ли сокет в режиме внедиапазонной метки.

HAS_SOCKET

Этот символ, если определён, указывает, что интерфейс BSD socket поддерживается.

HAS_SOCKETPAIR

Этот символ, если определён, указывает, что вызов BSD socketpair() поддерживается.

HAS_SOCKS5_INIT

Этот символ, если определён, указывает, что процедура socks5_init доступна для инициализации протокола SOCKS 5.

I_SOCKS

Этот символ, если определён, указывает, что socks.h существует и должен быть включён.

#ifdef I_SOCKS
    #include <socks.h>
#endif
I_SYS_SOCKIO

Этот символ, если определён, указывает, что sys/sockio.h должен быть включён для получения опций ioctl сокета, таких как SIOCATMARK.

#ifdef I_SYS_SOCKIO
    #include <sys_sockio.h>
#endif

Фильтры источников

filter_add

Описание в perlfilter.

SV*  filter_add(filter_t funcp, SV* datasv)
filter_del

Удаляет последний добавленный экземпляр функции-фильтра.

void  filter_del(filter_t funcp)
filter_read

Описание в perlfilter.

I32  filter_read(int idx, SV *buf_sv, int maxlen)
scan_vstring

Возвращает указатель на следующий символ после проанализированной vстроки, а также обновляет переданный sv.

Функция должна вызываться следующим образом:

sv = sv_2mortal(newSV(5));
s = scan_vstring(s,e,sv);

где s и e — начало и конец строки. Переменная sv должна быть достаточно большой для хранения переданной vстроки по соображениям производительности.

Эта функция может вызвать ошибку, если включены предупреждения fatal в области вызова, поэтому в примере используется sv_2mortal (для предотвращения утечки). Убедитесь, что вы вызываете SvREFCNT_inc после этого, если используете sv_2mortal.

char*  scan_vstring(const char *s, const char *const e, SV *sv)

Макросы управления стеком

dMARK

Объявляет переменную-маркер стека mark для XSUB. См. "MARK" и "dORIGMARK".

dMARK;
dORIGMARK

Сохраняет исходный маркер стека для XSUB. См. "ORIGMARK".

dORIGMARK;
dSP

Объявляет локальную копию указателя на стек Perl для XSUB, доступную через макрос SP. См. "SP".

dSP;
dTARGET

Объявляет, что эта функция использует TARG.

dTARGET;
EXTEND

Используется для расширения стека аргументов для значений возврата XSUB. После использования гарантируется, что на стеке есть место для помещения как минимум nitems элементов.

void  EXTEND(SP, SSize_t nitems)
MARK

Переменная-маркер стека для XSUB. См. "dMARK".

mPUSHi

Помещает целое число на стек. Стек должен иметь место для этого элемента. Не использует TARG. См. также "PUSHi", "mXPUSHi" и "XPUSHi".

void  mPUSHi(IV iv)
mPUSHn

Помещает число с плавающей точкой на стек. Стек должен иметь место для этого элемента. Не использует TARG. См. также "PUSHn", "mXPUSHn" и "XPUSHn".

void  mPUSHn(NV nv)
mPUSHp

Помещает строку на стек. Стек должен иметь место для этого элемента. len указывает длину строки. Не использует TARG. См. также "PUSHp", "mXPUSHp" и "XPUSHp".

void  mPUSHp(char* str, STRLEN len)
mPUSHs

Помещает SV на стек и делает его смертельным. Стек должен иметь место для этого элемента. Не использует TARG. См. также "PUSHs" и "mXPUSHs".

void  mPUSHs(SV* sv)
mPUSHu

Помещает беззнаковое целое число на стек. Стек должен иметь место для этого элемента. Не использует TARG. См. также "PUSHu", "mXPUSHu" и "XPUSHu".

void  mPUSHu(UV uv)
mXPUSHi

Помещает целое число на стек, расширяя его при необходимости. Не использует TARG. См. также "XPUSHi", "mPUSHi" и "PUSHi".

void  mXPUSHi(IV iv)
mXPUSHn

Помещает число с плавающей точкой на стек, расширяя его при необходимости. Не использует TARG. См. также "XPUSHn", "mPUSHn" и "PUSHn".

void  mXPUSHn(NV nv)
mXPUSHp

Помещает строку на стек, расширяя его при необходимости. len указывает длину строки. Не использует TARG. См. также "XPUSHp", mPUSHp и PUSHp.

void  mXPUSHp(char* str, STRLEN len)
mXPUSHs

Помещает SV на стек, расширяя его при необходимости и делая SV смертельным. Не использует TARG. См. также "XPUSHs" и "mPUSHs".

void  mXPUSHs(SV* sv)
mXPUSHu

Помещает беззнаковое целое число на стек, расширяя его при необходимости. Не использует TARG. См. также "XPUSHu", "mPUSHu" и "PUSHu".

void  mXPUSHu(UV uv)
newXSproto

Используется xsubpp для подключения XSUB как Perl-подпрограмм. Добавляет Perl-прототипы к подпрограммам.

ORIGMARK

Исходный маркер стека для XSUB. См. "dORIGMARK".

PL_markstack

Описание в perlguts.

PL_markstack_ptr

Описание в perlguts.

PL_savestack

Описание в perlguts.

PL_savestack_ix

Описание в perlguts.

PL_scopestack

Описание в perlguts.

PL_scopestack_ix

Описание в perlguts.

PL_scopestack_name

Описание в perlguts.

PL_stack_base

Описание в perlguts.

PL_stack_sp

Описание в perlguts.

PL_tmps_floor

Описание в perlguts.

PL_tmps_ix

Описание в perlguts.

PL_tmps_stack

Описание в perlguts.

POPi

Извлекает целое число со стека.

IV  POPi
POPl

Извлекает целое число типа long со стека.

long  POPl
POPn

Извлекает число с плавающей точкой со стека.

NV  POPn
POPp

Извлекает строку со стека.

char*  POPp
POPpbytex

Извлекает строку со стека, которая должна состоять из байтов, т. е. символов < 256.

char*  POPpbytex
POPpx

Извлекает строку со стека. Идентично POPp. Существует два имени по историческим причинам.

char*  POPpx
POPs

Извлекает SV со стека.

SV*  POPs
POPu

Извлекает беззнаковое целое число со стека.

UV  POPu
POPul

Извлекает беззнаковое целое число типа long со стека.

long  POPul
PUSHi

Помещает целое число на стек. Стек должен иметь место для этого элемента. Обрабатывает магию «set». Использует TARG, поэтому необходимо вызвать dTARGET или dXSTARG для объявления. Не вызывайте несколько макросов, ориентированных на TARG, для возврата списков из XSUB — используйте "mPUSHi" вместо этого. См. также "XPUSHi" и "mXPUSHi".

void  PUSHi(IV iv)
PUSHMARK

Открывающая скобка для аргументов в обратном вызове. См. "PUTBACK" и perlcall.

void  PUSHMARK(SP)
PUSHmortal

Помещает новый смертный SV на стек. Стек должен иметь место для этого элемента. Не использует TARG. См. также "PUSHs", "XPUSHmortal" и "XPUSHs".

void  PUSHmortal
PUSHn

Помещает число с плавающей точкой на стек. Стек должен иметь место для этого элемента. Обрабатывает магию «set». Использует TARG, поэтому необходимо вызвать dTARGET или dXSTARG для объявления. Не вызывайте несколько макросов, ориентированных на TARG, для возврата списков из XSUB — используйте "mPUSHn" вместо этого. См. также "XPUSHn" и "mXPUSHn".

void  PUSHn(NV nv)
PUSHp

Помещает строку на стек. Стек должен иметь место для этого элемента. len указывает длину строки. Обрабатывает магию «set». Использует TARG, поэтому необходимо вызвать dTARGET или dXSTARG для объявления. Не вызывайте несколько макросов, ориентированных на TARG, для возврата списков из XSUB — используйте "mPUSHp" вместо этого. См. также "XPUSHp" и "mXPUSHp".

void  PUSHp(char* str, STRLEN len)
PUSHs

Поместить SV в стек. В стеке должно быть место для этого элемента. Не обрабатывает магию 'set'. Не использует TARG. См. также "PUSHmortal", "XPUSHs", и "XPUSHmortal".

void  PUSHs(SV* sv)
PUSHu

Поместить целое без знака в стек. В стеке должно быть место для этого элемента. Обрабатывает магию 'set'. Использует TARG, поэтому необходимо вызвать dTARGET или dXSTARG для объявления. Не вызывайте несколько макросов, ориентированных на TARG, для возврата списков из XSUB — используйте "mPUSHu" вместо этого. См. также "XPUSHu" и "mXPUSHu".

void  PUSHu(UV uv)
PUTBACK

Закрывающая скобка для аргументов XSUB. Обычно обрабатывается xsubpp. См. "PUSHMARK" и perlcall для других применений.

PUTBACK;
SAVEt_INT

Описание в perlguts.

SP

Указатель стека. Обычно обрабатывается xsubpp. См. "dSP" и SPAGAIN.

SPAGAIN

Перезагрузка указателя стека. Используется после обратного вызова. См. perlcall.

SPAGAIN;
SSNEW
SSNEWa
SSNEWt
SSNEWat

Эти функции временно выделяют данные в стеке сохранений, возвращая индекс I32 в стек сохранений, так как указатель будет нарушен, если стек сохранений перемещен при перераспределении. Используйте "SSPTR" для преобразования возвращённого индекса в указатель.

Различия в форматах заключаются в том, что обычный SSNEW выделяет size байтов; SSNEWt и SSNEWat выделяют size объектов, каждый из которых имеет тип type; а <SSNEWa> и SSNEWat гарантируют выравнивание новых данных по границе align. Вероятно, наиболее полезное значение для выравнивания — "MEM_ALIGNBYTES". Выравнивание будет сохранено при перераспределении стека сохранений **только** если realloc возвращает данные, выровненные по размеру, кратному "align"!

I32  SSNEW  (Size_t size)
I32  SSNEWa (Size_t_size, Size_t align)
I32  SSNEWt (Size_t size, type)
I32  SSNEWat(Size_t_size, type, Size_t align)
SSPTR
SSPTRt

Эти функции преобразуют index, возвращаемое L/<SSNEW> и аналогичными функциями, в фактические указатели.

Разница в том, что SSPTR приводит результат к типу type, а SSPTRt приводит его к указателю на этот type.

type    SSPTR (I32 index, type)
type *  SSPTRt(I32 index, type)
TARG

TARG — сокращение от «мишень». Это запись в области памяти, на которую ссылается op_targ оператора. Это область временного хранения, часто используемая в качестве значения возврата оператора, но некоторые используют её для других целей.

TARG;
TOPs

Описание в perlguts.

XPUSHi

Поместить целое число в стек, если необходимо, расширив стек. Обрабатывает магию 'set'. Использует TARG, поэтому dTARGET или dXSTARG должны быть вызваны для объявления. Не вызывайте несколько макросов, ориентированных на TARG, для возврата списков из XSUB — используйте "mXPUSHi" вместо этого. См. также "PUSHi" и "mPUSHi".

void  XPUSHi(IV iv)
XPUSHmortal

Поместить новый смертный SV в стек, если необходимо, расширив стек. Не использует TARG. См. также "XPUSHs", "PUSHmortal" и "PUSHs".

void  XPUSHmortal
XPUSHn

Поместить двойное значение в стек, если необходимо, расширив стек. Обрабатывает магию 'set'. Использует TARG, поэтому dTARGET или dXSTARG должны быть вызваны для объявления. Не вызывайте несколько макросов, ориентированных на TARG, для возврата списков из XSUB — используйте "mXPUSHn" вместо этого. См. также "PUSHn" и "mPUSHn".

void  XPUSHn(NV nv)
XPUSHp

Поместить строку в стек, если необходимо, расширив стек. len указывает длину строки. Обрабатывает магию 'set'. Использует TARG, поэтому dTARGET или dXSTARG должны быть вызваны для объявления. Не вызывайте несколько макросов, ориентированных на TARG, для возврата списков из XSUB — используйте "mXPUSHp" вместо этого. См. также "PUSHp" и "mPUSHp".

void  XPUSHp(char* str, STRLEN len)
XPUSHs

Поместить SV в стек, если необходимо, расширив стек. Не обрабатывает магию 'set'. Не использует TARG. См. также "XPUSHmortal", PUSHs и PUSHmortal.

void  XPUSHs(SV* sv)
XPUSHu

Поместить целое без знака в стек, если необходимо, расширив стек. Обрабатывает магию 'set'. Использует TARG, поэтому dTARGET или dXSTARG должны быть вызваны для объявления. Не вызывайте несколько макросов, ориентированных на TARG, для возврата списков из XSUB — используйте "mXPUSHu" вместо этого. См. также "PUSHu" и "mPUSHu".

void  XPUSHu(UV uv)
XS_APIVERSION_BOOTCHECK

Макрос для проверки того, что версия API Perl, с которой скомпилирован модуль XS, соответствует версии API интерпретатора Perl, в который он загружается.

XS_APIVERSION_BOOTCHECK;
XSRETURN

Возврат из XSUB, указывающий количество элементов в стеке. Обычно обрабатывается xsubpp.

void  XSRETURN(int nitems)
XSRETURN_EMPTY

Немедленно вернуть пустой список из XSUB.

XSRETURN_EMPTY;
XSRETURN_IV

Немедленно вернуть целое число из XSUB. Использует XST_mIV.

void  XSRETURN_IV(IV iv)
XSRETURN_NO

Немедленно вернуть &PL_sv_no из XSUB. Использует XST_mNO.

XSRETURN_NO;
XSRETURN_NV

Немедленно вернуть двойное значение из XSUB. Использует XST_mNV.

void  XSRETURN_NV(NV nv)
XSRETURN_PV

Немедленно вернуть копию строки из XSUB. Использует XST_mPV.

void  XSRETURN_PV(char* str)
XSRETURN_UNDEF

Немедленно вернуть &PL_sv_undef из XSUB. Использует XST_mUNDEF.

XSRETURN_UNDEF;
XSRETURN_UV

Немедленно вернуть целое число из XSUB. Использует XST_mUV.

void  XSRETURN_UV(IV uv)
XSRETURN_YES

Немедленно вернуть &PL_sv_yes из XSUB. Использует XST_mYES.

XSRETURN_YES;
XST_mIV

Поместить целое число в указанную позицию pos стека. Значение хранится в новом смертном SV.

void  XST_mIV(int pos, IV iv)
XST_mNO

Поместить &PL_sv_no в указанную позицию pos стека.

void  XST_mNO(int pos)
XST_mNV

Поместить двойное значение в указанную позицию pos стека. Значение хранится в новом смертном SV.

void  XST_mNV(int pos, NV nv)
XST_mPV

Поместить копию строки в указанную позицию pos стека. Значение хранится в новом смертном SV.

void  XST_mPV(int pos, char* str)
XST_mUNDEF

Поместить &PL_sv_undef в указанную позицию pos стека.

void  XST_mUNDEF(int pos)
XST_mUV

Поместить целое число без знака в указанную позицию pos стека. Значение хранится в новом смертном SV.

void  XST_mUV(int pos, UV uv)
XST_mYES

Поместить &PL_sv_yes в указанную позицию pos стека.

void  XST_mYES(int pos)
XS_VERSION

Идентификатор версии модуля XS. Обычно автоматически обрабатывается ExtUtils::MakeMaker. См. "XS_VERSION_BOOTCHECK".

XS_VERSION_BOOTCHECK

Макрос для проверки того, что переменная $VERSION модуля PM соответствует переменной XS_VERSION модуля XS. Обычно автоматически обрабатывается xsubpp. См. "The VERSIONCHECK: Keyword" in perlxs.

XS_VERSION_BOOTCHECK;

Обработка строк

См. также "Unicode Support".

CAT2

Этот макрос конкатенирует 2 токена.

token  CAT2(token x, token y)
Copy
CopyD

Интерфейс XSUB к C-функции memcpy. src — источник, dest — пункт назначения, nitems — количество элементов, type — тип. Может завершиться ошибкой при перекрывающихся копированиях. См. также "Move".

CopyD похож на Copy, но возвращает dest. Полезно для стимулирования оптимизации компилятором хвостовой рекурсии.

void    Copy (void* src, void* dest, int nitems, type)
void *  CopyD(void* src, void* dest, int nitems, type)
delimcpy

Скопировать исходный буфер в буфер назначения, остановившись на (но не включая) первой встретившейся в исходном буфере неэкранированной (определенной ниже) разделительной байт, delim. Исходным являются байты между from и from_end - 1. Аналогично, dest - to до to_end.

Количество скопированных байтов записывается в *retlen.

Возвращает позицию первого нескопированного delim в буфере from, но если такой символ не встретится до from_end, то возвращается from_end, и весь буфер from .. from_end - 1 копируется.

Если после копирования в буфере назначения есть место, добавляется дополнительный завершающий контрольный NUL байт (не включён в возвращаемую длину).

Случай ошибки возникает, если буфер назначения недостаточно велик, чтобы вместить всё, что должно быть скопировано. В этом случае значение, большее, чем to_end - to, записывается в *retlen, и столько байтов из исходного буфера, сколько поместится, будет записано в буфер назначения. Отсутствие места для контрольного NUL байта не считается ошибкой.

В следующих примерах пусть x будет разделителем, а 0 представляет байт NUL (НЕ цифру 0). Тогда у нас будет

 Source     Destination
abcxdef        abc0

при условии, что буфер назначения имеет длину не менее 4 байт.

Экранированный разделитель — это разделитель, непосредственно предшествующий которому стоит один обратный слэш. Экранированные разделители копируются, и копирование продолжается после разделителя; обратный слэш не копируется:

 Source       Destination
abc\xdef       abcxdef0

(при условии, что буфер назначения имеет длину не менее 8 байт).

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

    Source         Destination
    abc\xdef          abcxdef0
  abc\\\xdef        abc\\xdef0
abc\\\\\xdef      abc\\\\xdef0

(как и всегда, если буфер назначения достаточно велик)

Чётное количество предшествующих обратных слэшей не экранирует разделитель, поэтому копирование останавливается непосредственно перед ним, и все обратные слэши включаются (без удаления; ноль считается чётным):

    Source         Destination
    abcxdef          abc0
  abc\\xdef          abc\\0
abc\\\\xdef          abc\\\\0
char*  delimcpy(char* to, const char* to_end, const char* from,
                const char* from_end, const int delim,
                I32* retlen)
do_join

Это выполняет операцию Perl join, помещая объединенный результат в sv.

Элементы для объединения хранятся в SVs, в массиве указателей на SVs в C, от **mark до **sp - 1. Таким образом *mark - ссылка на первый SV. Каждый SV будет приведен к типу PV, если он не является таковым.

delim содержит строку (или строковый эквивалент), которая будет разделяющим элементом при объединении.

Если какой-либо компонент представлен в формате UTF-8, то результатом будет также UTF-8, и все компоненты, не представленные в формате UTF-8, будут преобразованы в UTF-8 по мере необходимости.

Обрабатываются магические свойства и метки заражения.

void  do_join(SV *sv, SV *delim, SV **mark, SV **sp)
do_sprintf

Это выполняет операцию Perl sprintf, помещая строковый результат в sv.

Элементы для форматирования хранятся в массиве указателей на SVs в C, длиной len> и начиная с **sarg. Элемент, на который ссылается *sarg, является форматом.

Обрабатываются магические свойства и метки заражения.

void  do_sprintf(SV* sv, SSize_t len, SV** sarg)
fbm_compile

Анализирует строку, чтобы ускорить поиск в ней с помощью fbm_instr() — алгоритма Бойера-Мура.

void  fbm_compile(SV* sv, U32 flags)
fbm_instr

Возвращает местоположение SV в строке, ограниченной big и bigend (bigend) — символ, следующий за последним символом). Возвращает NULL при отсутствии строки. sv не обязательно должен быть fbm_compiled, но поиск в таком случае будет менее эффективным.

char*  fbm_instr(unsigned char* big, unsigned char* bigend,
                 SV* littlestr, U32 flags)
foldEQ

Возвращает true, если первые len байтов строк s1 и s2 одинаковы без учета регистра; иначе — false. Байты ASCII-диапазона (в верхнем и нижнем регистре) совпадают сами с собой и со своими аналогами в противоположном регистре. Байты вне ASCII-диапазона и без регистра совпадают только сами с собой.

I32  foldEQ(const char* a, const char* b, I32 len)
ibcmp

Это синоним для (! foldEQ())

I32  ibcmp(const char* a, const char* b, I32 len)
ibcmp_locale

Это синоним для (! foldEQ_locale())

I32  ibcmp_locale(const char* a, const char* b, I32 len)
ibcmp_utf8

Это синоним для (! foldEQ_utf8())

I32  ibcmp_utf8(const char *s1, char **pe1, UV l1, bool u1,
                const char *s2, char **pe2, UV l2, bool u2)
instr

Аналогично strstr(3), которое находит и возвращает указатель на первое вхождение NUL-завершающей подстроки little в NUL-завершающей строке big, возвращая NULL при отсутствии вхождения. Завершающие NUL-байты не сравниваются.

char*  instr(const char* big, const char* little)
memCHRs

Возвращает позицию первого появления байта c в литеральной строке "list", или NULL, если c не встречается в "list". Все байты обрабатываются как unsigned char. Таким образом, этот макрос можно использовать для определения, входит ли c в заданный набор символов. В отличие от strchr(3), он работает даже если c является NUL (и набор не включает NUL).

bool  memCHRs("list", char c)
memEQ

Сравнивает два буфера (которые могут содержать вложенные NUL символы) на равенство. Параметр len указывает количество байтов для сравнения. Возвращает true или false. Неопределённое поведение, если ни один из буферов не содержит по крайней мере len байтов.

bool  memEQ(char* s1, char* s2, STRLEN len)
memEQs

Аналогично "memEQ", но вторая строка является литералом, заключенным в двойные кавычки, l1 задаёт количество байтов в s1. Возвращает true или false.

bool  memEQs(char* s1, STRLEN l1, "s2")
memNE

Сравнивает два буфера (которые могут содержать вложенные NUL символы) на неравенство. Параметр len указывает количество байтов для сравнения. Возвращает true или false. Неопределённое поведение, если ни один из буферов не содержит по крайней мере len байтов.

bool  memNE(char* s1, char* s2, STRLEN len)
memNEs

Аналогично "memNE", но вторая строка является литералом, заключенным в двойные кавычки, l1 задаёт количество байтов в s1. Возвращает true или false.

bool  memNEs(char* s1, STRLEN l1, "s2")
Move
MoveD

Интерфейс XSUB-писателя для C-функции memmove. src — источник, dest — назначение, nitems — количество элементов, а type — тип. Поддерживает перекрывающиеся перемещения. См. также "Copy".

MoveD подобно Move , но возвращает dest. Помогает компиляторам оптимизировать вызовы хвостовой рекурсии.

void    Move (void* src, void* dest, int nitems, type)
void *  MoveD(void* src, void* dest, int nitems, type)
my_snprintf

Функциональность C-библиотеки snprintf, если она доступна и соответствует стандартам (на самом деле использует vsnprintf). Однако, если vsnprintf недоступна, к сожалению, используется небезопасная функция vsprintf, которая может привести к переполнению буфера (есть проверка переполнения, но это может быть слишком поздно). Вместо этого рассмотрите использование sv_vcatpvf или получение vsnprintf.

int  my_snprintf(char *buffer, const Size_t len,
                 const char *format, ...)
my_sprintf

DEPRECATED! Планируется удалить my_sprintf из будущих релизов Perl. Не используйте её в новом коде; удалите из существующего.

НЕ используйте из-за возможности переполнения buffer. Используйте my_snprintf() вместо неё.

int  my_sprintf(NN char *buffer, NN const char *pat, ...)
my_strlcat

Функция C-библиотеки strlcat, если доступна, или реализация Perl. Работает со строками C, завершаемыми нулём.

my_strlcat() добавляет строку src в конец dst. Добавит не более size - strlen(dst) - 1 символов. Затем завершит нулём, если size не равно 0 или исходная строка dst была длиннее size (на практике этого не должно происходить, так как это означает, что либо size неверна, либо dst не является правильной строкой, завершаемой нулём).

Обратите внимание, что size — это полный размер буфера назначения, и результат гарантированно завершён нулём, если есть место. Убедитесь, что в size есть место для NUL.

Значение возврата — это общая длина, которую dst имела бы, если бы size была достаточно большой. Таким образом, это начальная длина dst плюс длина src. Если size меньше возвращаемого значения, избыток не был добавлен.

Size_t  my_strlcat(char *dst, const char *src, Size_t size)
my_strlcpy

Функция C-библиотеки strlcpy, если доступна, или реализация Perl. Работает со строками C, завершаемыми нулём.

my_strlcpy() копирует до size - 1 символов из строки src в dst, завершая результат нулём, если size не равно 0.

Возвращаемое значение — общая длина, которую src имела бы, если бы копирование прошло успешно. Если оно больше size, избыток не был скопирован.

Size_t  my_strlcpy(char *dst, const char *src, Size_t size)
my_strnlen

Функция C-библиотеки strnlen, если доступна, или реализация Perl.

my_strnlen() вычисляет длину строки до maxlen символов. Никогда не обращается к более чем maxlen символам, что делает её подходящей для использования со строками, которые не гарантированно завершаются нулём.

Size_t  my_strnlen(const char *str, Size_t maxlen)
my_vsnprintf

Библиотека C vsnprintf если она доступна и соответствует стандартам. Однако, если vsnprintf недоступна, к сожалению, будет использована небезопасная функция vsprintf, которая может привести к переполнению буфера (есть проверка на переполнение, но это может быть слишком поздно). Рассмотрите использование sv_vcatpvf вместо этого или получение vsnprintf.

int  my_vsnprintf(char *buffer, const Size_t len,
                  const char *format, va_list ap)
ninstr

Найти первое (самое левое) вхождение последовательности байтов в другой последовательности. Это версия Perl функции strstr(), расширенная для обработки произвольных последовательностей, потенциально содержащих встроенные символы NUL (NUL - это то, что обозначает начальное n в имени функции; на некоторых системах есть эквивалент, memmem(), но с несколько другим API).

Другой способ интерпретации этой функции — поиск иголки в стоге сена. big указывает на первый байт в стоге сена. big_end указывает на байт, следующий за последним байтом в стоге сена. little указывает на первый байт в иголке. little_end указывает на байт, следующий за последним байтом в иголке. Все параметры должны быть не-NULL.

Функция возвращает NULL если нет вхождения little в big. Если little является пустой строкой, возвращается big.

Поскольку эта функция работает на уровне байтов и из-за присущих особенностей UTF-8 (или UTF-EBCDIC), она будет работать правильно, если и иголка, и стог сена — строки с одинаковым UTF-8, но не если UTF-8 различаются.

char*  ninstr(const char* big, const char* bigend,
              const char* little, const char* lend)
Nullch

Указатель на нулевой символ. (Больше не доступен, когда PERL_CORE определено.)

PL_na

Временная переменная, в которой хранится значение STRLEN. Было бы лучше назвать ее как-то типа PL_temp_strlen.

Обычно используется с SvPV, когда фактически планируется отбросить возвращаемую длину (отсюда и длина «Неприменима», отсюда и название этой переменной).

Обычно более эффективно либо объявить локальную переменную и использовать ее вместо этого, либо использовать макрос SvPV_nolen.

STRLEN  PL_na
rninstr

Подобно "ninstr", но вместо этого находит последнее (самое правое) вхождение последовательности байтов в другой последовательности, возвращая NULL если такого вхождения нет.

char*  rninstr(const char* big, const char* bigend,
               const char* little, const char* lend)
savepv

Перловый аналог strdup(). Возвращает указатель на недавно выделенную строку, которая является дубликатом pv. Размер строки определяется strlen(), что означает, что она может не содержать встроенных NUL символов и должна иметь завершающий NUL. Для предотвращения утечек памяти, память, выделенная для новой строки, необходимо освободить, когда она больше не нужна. Это можно сделать с помощью функции "Safefree" или SAVEFREEPV.

На некоторых платформах, например, Windows, вся выделенная память, принадлежащая потоку, освобождается при завершении этого потока. Поэтому, если вам нужно, чтобы этого не происходило, необходимо использовать функции совместного использования памяти, такие как "savesharedpv".

char*  savepv(const char* pv)
savepvn

Перловый аналог того, чем был бы strndup(), если бы он существовал. Возвращает указатель на вновь выделенную строку, которая является дубликатом первых len байтов из pv, плюс завершающий NUL байт. Выделенную для новой строки память можно освободить с помощью функции Safefree().

На некоторых платформах, например, Windows, вся выделенная память, принадлежащая потоку, освобождается при завершении этого потока. Поэтому, если вам нужно, чтобы этого не происходило, необходимо использовать функции совместного использования памяти, такие как "savesharedpvn".

char*  savepvn(const char* pv, Size_t len)
savepvs

Как savepvn, но принимает строку-литерал вместо пары строка/длина.

char*  savepvs("literal string")
savesharedpv

Версия savepv(), которая выделяет дублирующую строку в памяти, совместно используемой между потоками.

char*  savesharedpv(const char* pv)
savesharedpvn

Версия savepvn(), которая выделяет дублирующую строку в памяти, совместно используемой между потоками. (С конкретным отличием, что указатель NULL неприемлем.)

char*  savesharedpvn(const char *const pv, const STRLEN len)
savesharedpvs

Версия savepvs(), которая выделяет дублирующую строку в памяти, совместно используемой между потоками.

char*  savesharedpvs("literal string")
savesharedsvpv

Версия savesharedpv(), которая выделяет дублирующую строку в памяти, совместно используемой между потоками.

char*  savesharedsvpv(SV *sv)
savesvpv

Версия savepv()/savepvn(), которая получает строку для дублирования из переданного SV, используя SvPV()

На некоторых платформах, например, Windows, вся выделенная память, принадлежащая потоку, освобождается при завершении этого потока. Поэтому, если вам нужно, чтобы этого не происходило, необходимо использовать функции совместного использования памяти, такие как "savesharedsvpv".

char*  savesvpv(SV* sv)
strEQ

Проверка двух строк, завершаемых символом NUL, на равенство. Возвращает true или false.

bool  strEQ(char* s1, char* s2)
strGE

Проверка двух строк, завершаемых символом NUL, на то, является ли первая, s1, больше или равна второй, s2. Возвращает true или false.

bool  strGE(char* s1, char* s2)
strGT

Проверка двух строк, завершаемых символом NUL, на то, является ли первая, s1, больше второй, s2. Возвращает true или false.

bool  strGT(char* s1, char* s2)
STRINGIFY

Этот макрос обрамляет свой токен двойными кавычками.

string  STRINGIFY(token x)
strLE

Проверка двух строк, завершаемых символом NUL, на то, является ли первая, s1, меньше или равна второй, s2. Возвращает true или false.

bool  strLE(char* s1, char* s2)
STRLEN

Описано в perlguts.

strLT

Проверка двух строк, завершаемых символом NUL, на то, является ли первая, s1, меньше второй, s2. Возвращает true или false.

bool  strLT(char* s1, char* s2)
strNE

Проверка двух строк, завершаемых символом NUL, на различие. Возвращает true или false.

bool  strNE(char* s1, char* s2)
strnEQ

Проверка двух строк, завершаемых символом NUL, на равенство. Параметр len указывает количество байтов для сравнения. Возвращает true или false. (Обёртка для strncmp).

bool  strnEQ(char* s1, char* s2, STRLEN len)
strnNE

Проверка двух строк, завершаемых символом NUL, на различие. Параметр len указывает количество байтов для сравнения. Возвращает true или false. (Обёртка для strncmp).

bool  strnNE(char* s1, char* s2, STRLEN len)
STR_WITH_LEN

Возвращает две разделенные запятой составляющие входной строковой литеральной и ее длины. Это удобный макрос, который помогает в некоторых вызовах API. Обратите внимание, что его нельзя использовать в качестве аргумента макросов или функций, которые в некоторых конфигурациях могут быть макросами, что означает, что для любых вызовов API, где он используется, требуется полная форма Perl_xxx(aTHX_ ...).

pair  STR_WITH_LEN("literal string")
Zero
ZeroD

Интерфейс XSUB-писца к функции C memzero. dest — это место назначения, nitems — количество элементов, а type — тип.

ZeroD похож на Zero, но возвращает dest. Полезно для поощрения оптимизации компиляторами вызовов с возвратом.

void    Zero (void* dest, int nitems, type)
void *  ZeroD(void* dest, int nitems, type)

SV Флаги

SVt_IV

Флаг типа для скаляров. См. "svtype".

SVt_NULL

Флаг типа для скаляров. См. "svtype".

SVt_NV

Флаг типа для скаляров. См. "svtype".

SVt_PV

Флаг типа для скаляров. См. "svtype".

SVt_PVAV

Флаг типа для массивов. См. "svtype".

SVt_PVCV

Флаг типа для подпрограмм. См. "svtype".

SVt_PVFM

Флаг типа для форматов. См. "svtype".

SVt_PVGV

Флаг типа для typeglobs. См. "svtype".

SVt_PVHV

Флаг типа для хэшей. См. "svtype".

SVt_PVIO

Флаг типа для объектов ввода/вывода. См. "svtype".

SVt_PVIV

Флаг типа для скаляров. См. "svtype".

SVt_PVLV

Флаг типа для скаляров. См. "svtype".

SVt_PVMG

Флаг типа для скаляров. См. "svtype".

SVt_PVNV

Флаг типа для скаляров. См. "svtype".

SVt_REGEXP

Флаг типа для регулярных выражений. См. "svtype".

END_OF_DOCUMENT_MARKER
svtype

Перечисление флагов для типов Perl. Они находятся в файле sv.h в svtype перечислении. Проверьте эти флаги с помощью макроса SvTYPE.

Типы:

SVt_NULL
SVt_IV
SVt_NV
SVt_RV
SVt_PV
SVt_PVIV
SVt_PVNV
SVt_PVMG
SVt_INVLIST
SVt_REGEXP
SVt_PVGV
SVt_PVLV
SVt_PVAV
SVt_PVHV
SVt_PVCV
SVt_PVFM
SVt_PVIO

Их легче всего объяснить, начиная снизу.

SVt_PVIO предназначен для объектов ввода-вывода, SVt_PVFM для форматов, SVt_PVCV для подпрограмм, SVt_PVHV для хешей и SVt_PVAV для массивов.

Все остальные — скалярные типы, то есть вещи, которые могут быть привязаны к переменной $. Для них внутренние типы в основном ортогональны типам языка Perl.

Следовательно, проверка SvTYPE(sv) < SVt_PVAV — лучший способ определить, является ли что-то скаляром.

SVt_PVGV представляет собой типглоб. Если !SvFAKE(sv), то это реальный, не преобразуемый типглоб. Если SvFAKE(sv), то это скаляр, которому был присвоен типглоб. При повторном присваивании он перестанет быть типглобом. SVt_PVLV представляет скаляр, делегирующий другому скаляру за кулисами. Он используется, например, для возвращаемого значения substr и для связанных хешей и элементов массивов. Он может содержать любое скалярное значение, включая типглоб. SVt_REGEXP предназначен для регулярных выражений. SVt_INVLIST предназначен только для внутреннего использования ядром Perl.

SVt_PVMG представляет "обычный" скаляр (не типглоб, регулярное выражение или делегат). Поскольку большинству скаляров не нужны все внутренние поля PVMG, мы экономим память, выделяя более мелкие структуры, когда это возможно. Все остальные типы — это просто более простые формы SVt_PVMG, с меньшим количеством внутренних полей. SVt_NULL может содержать только undef. SVt_IV может содержать undef, целое число или ссылку. (SVt_RV — псевдоним для SVt_IV, который существует для обратной совместимости.) SVt_NV может содержать любое из этих значений или двойное. SVt_PV может содержать только undef или строку. SVt_PVIV — это супермножество SVt_PV и SVt_IV. SVt_PVNV аналогичен. SVt_PVMG может содержать всё, что может содержать SVt_PVNV, но может, но не обязательно, быть благословлённым или магическим.

Обработка SV

boolSV

Возвращает SV true, если b имеет истинное значение, или SV false, если b равно 0.

См. также "PL_sv_yes" и "PL_sv_no".

SV *  boolSV(bool b)
croak_xs_usage

Специализированная разновидность croak() для вывода сообщения об использовании xsubs.

croak_xs_usage(cv, "eee_yow");

определяет имя пакета и имя подпрограммы из cv, а затем вызывает croak(). Следовательно, если cv равно &ouch::awk, он вызовет croak следующим образом:

Perl_croak(aTHX_ "Usage: %" SVf "::%" SVf "(%s)", "ouch" "awk",
                                                    "eee_yow");
void  croak_xs_usage(const CV *const cv, const char *const params)
DEFSV

Возвращает SV, связанный с $_.

SV *  DEFSV
DEFSV_set

Связывает sv с $_.

void  DEFSV_set(SV * sv)
get_sv

Возвращает SV указанного скаляра Perl. flags передаются в "gv_fetchpv". Если GV_ADD установлено, и переменная Perl не существует, она будет создана. Если flags равно нулю, и переменная не существует, возвращается NULL.

ПРИМЕЧАНИЕ: форма perl_get_sv() устарела.

SV*  get_sv(const char *name, I32 flags)
isGV_with_GP

Возвращает логическое значение, указывающее, является ли sv GV с указателем на GP (указатель на типглоб).

bool  isGV_with_GP(SV * sv)
looks_like_number

Проверяет, выглядит ли содержимое SV как число (или является числом). Inf и Infinity обрабатываются как числа (при этом предупреждение о нечисловом значении не выдаётся), даже если ваш atof() их не понимает. Магия получения игнорируется.

I32  looks_like_number(SV *const sv)
MUTABLE_PTR
MUTABLE_AV
MUTABLE_CV
MUTABLE_GV
MUTABLE_HV
MUTABLE_IO
MUTABLE_SV

Макросы MUTABLE_*() выполняют приведение указателей к указанным типам таким образом (если позволяет компилятор), что приведение от const даст предупреждение; например:

const SV *sv = ...;
AV *av1 = (AV*)sv;        <== BAD:  the const has been silently
                                    cast away
AV *av2 = MUTABLE_AV(sv); <== GOOD: it may warn

MUTABLE_PTR — это базовый макрос, используемый для получения новых приведений. Другие уже встроенные возвращают указатели на то, что указано в их именах.

void *  MUTABLE_PTR(void * p)
AV *    MUTABLE_AV (AV * p)
CV *    MUTABLE_CV (CV * p)
GV *    MUTABLE_GV (GV * p)
HV *    MUTABLE_HV (HV * p)
IO *    MUTABLE_IO (IO * p)
SV *    MUTABLE_SV (SV * p)
newRV
newRV_inc

Они идентичны. Они создают оболочку RV для SV. Счётчик ссылок исходного SV увеличивается.

SV*  newRV(SV *const sv)
newRV_noinc

Создаёт оболочку RV для SV. Счётчик ссылок исходного SV не увеличивается.

SV*  newRV_noinc(SV *const tmpRef)
newSV

Создаёт новый SV. Параметр len не равный нулю указывает количество байтов предварительно выделенного пространства для строк, которое должно иметь SV. Также резервируется дополнительный байт для завершающего NUL. (SvPOK не устанавливается для SV, даже если выделено пространство для строк.) Счётчик ссылок нового SV устанавливается в 1.

В версии 5.9.3, newSV() заменяет более старую API NEWSV(), и опускает первый параметр x — вспомогательную функцию отладки, позволяющую вызывающим сторонам идентифицировать себя. Эта функция была заменена новой опцией сборки, PERL_MEM_LOG (см. "PERL_MEM_LOG" в perlhacktips). Более старая API по-прежнему доступна для использования в XS-модулях, поддерживающих более старые версии Perl.

SV*  newSV(const STRLEN len)
newSVhek

Создаёт новый SV из структуры ключа хеша. Он будет генерировать скаляры, указывающие на общую таблицу строк, где это возможно. Возвращает новый (неопределённый) SV, если hek равно NULL.

SV*  newSVhek(const HEK *const hek)
newSViv

Создаёт новый SV и копирует в него целое число. Счётчик ссылок для SV устанавливается в 1.

SV*  newSViv(const IV i)
newSVnv

Создаёт новый SV и копирует в него значение с плавающей запятой. Счётчик ссылок для SV устанавливается в 1.

SV*  newSVnv(const NV n)
newSVpadname

ПРИМЕЧАНИЕ: newSVpadname — экспериментальная функция и может быть изменена или удалена без предварительного уведомления.

Создаёт новый SV, содержащий имя блока.

SV*  newSVpadname(PADNAME *pn)
newSVpv

Создаёт новый SV и копирует в него строку (которая может содержать NUL (\0) символы). Счётчик ссылок для SV устанавливается в 1. Если len равно нулю, Perl вычислит длину, используя strlen(), (что означает, что если вы используете этот вариант, то s не может содержать вложенные NUL символы и должен иметь завершающий NUL байт).

Эта функция может вызвать проблемы надёжности, если вы склонны передавать пустые строки, которые не завершаются нулём, потому что она будет вызывать strlen на строке и потенциально переходить за границы допустимой памяти.

Использование "newSVpvn" — более безопасная альтернатива для строк без завершения нулём. Для строковых литералов используйте "newSVpvs" вместо этого. Эта функция будет работать нормально для строк, завершаемых нулём, но если вы хотите избежать условного оператора, вызывающего strlen, используйте newSVpvn вместо него (вызвав strlen самостоятельно).

SV*  newSVpv(const char *const s, const STRLEN len)
newSVpvf

Создаёт новый SV и инициализирует его строкой, отформатированной как sv_catpvf.

ПРИМЕЧАНИЕ: newSVpvf необходимо вызывать явно как Perl_newSVpvf с параметром aTHX_.

SV*  Perl_newSVpvf(pTHX_ const char *const pat, ...)
newSVpvf_nocontext

Подобно "newSVpvf", но не принимает параметр контекста потока (aTHX), поэтому используется в ситуациях, когда у вызывающей стороны ещё нет контекста потока.

SV*  newSVpvf_nocontext(const char *const pat, ...)
newSVpvn

Создаёт новый SV и копирует в него строку, которая может содержать NUL символы (\0) и другие двоичные данные. Счётчик ссылок для SV устанавливается в 1. Обратите внимание, что если len равно нулю, Perl создаст строку длиной ноль (Perl). Вы несёте ответственность за обеспечение того, что исходный буфер имеет длину не менее len байт. Если параметр buffer равен NULL, новый SV будет неопределённым.

SV*  newSVpvn(const char *const buffer, const STRLEN len)
newSVpvn_flags

Создаёт новый SV и копирует в него строку (которая может содержать NUL (\0) символы). Счётчик ссылок для SV устанавливается в 1. Обратите внимание, что если len равно нулю, Perl создаст строку длиной ноль. Вы несёте ответственность за обеспечение того, что исходная строка имеет длину не менее len байт. Если параметр s равен NULL, новый SV будет неопределённым. В настоящее время единственные принимаемые флаги — SVf_UTF8 и SVs_TEMP. Если SVs_TEMP установлен, sv_2mortal() вызывается для результата перед возвратом. Если SVf_UTF8 установлен, s считается UTF-8, и флаг SVf_UTF8 будет установлен в новом SV. newSVpvn_utf8() — это функция-оболочка для этой функции, определённая как

#define newSVpvn_utf8(s, len, u)                    \
    newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
SV*  newSVpvn_flags(const char *const s, const STRLEN len,
                    const U32 flags)
newSVpvn_share

Создаёт новый SV с его SvPVX_const, указывающим на общую строку в таблице строк. Если строка ещё не существует в таблице, она создаётся сначала. Включает флаг SvIsCOW (или READONLY и FAKE в версиях 5.16 и более ранних). Если параметр hash не равен нулю, используется это значение; в противном случае вычисляется хеш. Хеш строки может быть получен из SV с помощью макроса "SvSHARED_HASH". Здесь идея в том, что поскольку таблица строк используется для общих ключей хешей, эти строки будут иметь SvPVX_const == HeKEY, и поиск по хешу позволит избежать сравнения строк.

SV*  newSVpvn_share(const char* s, I32 len, U32 hash)
newSVpvn_utf8

Создаёт новый SV и копирует в него строку (которая может содержать NUL (\0) символы). Если utf8 истинно, вызывается SvUTF8_on для нового SV. Реализовано как оболочка вокруг newSVpvn_flags.

SV*  newSVpvn_utf8(const char* s, STRLEN len, U32 utf8)
newSVpvs

Подобно newSVpvn, но принимает строковый литерал вместо пары строка/длина.

SV*  newSVpvs("literal string")
newSVpvs_flags

Подобно newSVpvn_flags, но принимает строку-литерал вместо пары «строка/длина».

SV*  newSVpvs_flags("literal string", U32 flags)
newSVpv_share

Подобно newSVpvn_share, но принимает строку, завершённую символом NUL, вместо пары «строка/длина».

SV*  newSVpv_share(const char* s, U32 hash)
newSVpvs_share

Подобно newSVpvn_share, но принимает строку-литерал вместо пары «строка/длина» и опускает параметр хеша.

SV*  newSVpvs_share("literal string")
newSVrv

Создаёт новый SV для существующего RV, rv, на который он будет указывать. Если rv не является RV, он будет преобразован в RV. Если classname не равен нулю, новый SV будет благословлён в указанном пакете. Возвращается новый SV, и его счётчик ссылок равен 1. Счётчик ссылок 1 принадлежит rv. Также см. newRV_inc() и newRV_noinc() для правильного создания нового RV.

SV*  newSVrv(SV *const rv, const char *const classname)
newSVsv
newSVsv_nomg
newSVsv_flags

Эти функции создают новый SV, являющийся точной копией исходного SV (используя sv_setsv).

Они отличаются только тем, что newSVsv выполняет «магию получения»; newSVsv_nomg пропускает любую магию; и newSVsv_flags позволяет явно задать параметр flags.

SV*  newSVsv      (SV *const old)
SV*  newSVsv_nomg (SV *const old)
SV*  newSVsv_flags(SV *const old, I32 flags)
newSV_type

Создаёт новый SV указанного типа. Счётчик ссылок нового SV устанавливается в 1.

SV*  newSV_type(const svtype type)
newSV_type_mortal

Создаёт новый смертный SV указанного типа. Счётчик ссылок нового SV устанавливается в 1.

Это эквивалентно SV* sv = sv_2mortal(newSV_type(<some type>)) и SV* sv = sv_newmortal(); sv_upgrade(sv, <some_type>), но должно быть эффективнее обоих. (Если sv_2mortal будет в какой-то момент встроен в код).

SV*  newSV_type_mortal(const svtype type)
newSVuv

Создаёт новый SV и копирует в него целое беззнаковое число. Счётчик ссылок SV устанавливается в 1.

SV*  newSVuv(const UV u)
Nullsv

Указатель на нулевой SV. (Больше недоступен, когда определено PERL_CORE.)

PL_sv_no

Это SV false. Он является только для чтения. См. "PL_sv_yes". Всегда ссылайтесь на него как на &PL_sv_no.

SV  PL_sv_no
PL_sv_undef

Это SV undef. Он является только для чтения. Всегда ссылайтесь на него как на &PL_sv_undef.

SV  PL_sv_undef
PL_sv_yes

Это SV true. Он является только для чтения. См. "PL_sv_no". Всегда ссылайтесь на него как на &PL_sv_yes.

SV  PL_sv_yes
PL_sv_zero

Этот неизменяемый SV имеет нулевое числовое значение и строковое значение "0". Он похож на "PL_sv_no", за исключением строкового значения. Может использоваться как дешёвая альтернатива mXPUSHi(0), например. Всегда ссылайтесь на него как на &PL_sv_zero. Введён в 5.28.

SV  PL_sv_zero
SAVE_DEFSV

Локализует $_. См. "Локализация изменений" в perlguts.

void  SAVE_DEFSV
sortsv

Сортирует массив указателей SV на месте с помощью заданной функции сравнения.

В настоящее время всегда используется сортировка слиянием. См. "sortsv_flags" для более гибкой функции.

void  sortsv(SV** array, size_t num_elts, SVCOMPARE_t cmp)
sortsv_flags

Сортирует массив указателей SV на месте с помощью заданной функции сравнения, используя различные флаги SORTf_*.

void  sortsv_flags(SV** array, size_t num_elts, SVCOMPARE_t cmp,
                   U32 flags)
SV

Описание см. в perlguts.

sv_2cv

Используя различные приёмы, пытается получить CV из SV; дополнительно, если возможно, установить *st и *gvp в хранилище и GV, связанные с ним. Флаги в lref передаются gv_fetchsv.

CV*  sv_2cv(SV* sv, HV **const st, GV **const gvp, const I32 lref)
sv_2io

Используя различные приёмы, пытается получить IO из SV: слот IO, если это GV; или рекурсивный результат, если это RV; или слот IO символа, названного по имени PV, если это строка.

«Магия получения» игнорируется для переданного sv, но будет вызвана для SvRV(sv), если sv является RV.

IO*  sv_2io(SV *const sv)
sv_2iv_flags

Возвращает целое значение SV, выполняя необходимые преобразования строки. Если у flags установлен бит SV_GMAGIC, выполняет mg_get() вначале. Обычно используется через макросы SvIV(sv) и SvIVx(sv).

IV  sv_2iv_flags(SV *const sv, const I32 flags)
sv_2mortal

Помечает существующий SV как смертный. SV будет уничтожен «скоро», либо явным вызовом FREETMPS, либо неявным вызовом в местах, таких как границы операторов. SvTEMP() включено, что означает, что буфер строки SV может быть «украден», если этот SV скопирован. Также см. "sv_newmortal" и "sv_mortalcopy".

SV*  sv_2mortal(SV *const sv)
sv_2nv_flags

Возвращает числовое значение SV, выполняя необходимые преобразования строки или целого числа. Если у flags установлен бит SV_GMAGIC, выполняет mg_get() вначале. Обычно используется через макросы SvNV(sv) и SvNVx(sv).

NV  sv_2nv_flags(SV *const sv, const I32 flags)
sv_2pv
sv_2pv_flags

Эти функции реализуют различные формы макросов "SvPV" в perlapi. Макросы являются предпочтительным интерфейсом.

Они возвращают указатель на строковое значение SV (приводя его к строке, если необходимо), и устанавливают *lp на его длину в байтах.

Различия заключаются в том, что обычные sv_2pvbyte всегда обрабатывают «магию получения»; и sv_2pvbyte_flags обрабатывают «магию получения» только в том случае, если flags содержит SV_GMAGIC.

char*  sv_2pv      (SV *sv, STRLEN *lp)
char*  sv_2pv_flags(SV *const sv, STRLEN *const lp,
                    const U32 flags)
sv_2pvbyte
sv_2pvbyte_flags

Эти функции реализуют различные формы макросов "SvPVbyte" в perlapi. Макросы являются предпочтительным интерфейсом.

Они возвращают указатель на байтовое представление SV и устанавливают *lp на его длину. Если SV помечен как закодированный в UTF-8, он будет, если возможно, понижен до строковой строки. Если SV нельзя понизить, они вызывают ошибку.

Различия заключаются в том, что обычные sv_2pvbyte всегда обрабатывают «магию получения»; и sv_2pvbyte_flags обрабатывают «магию получения» только в том случае, если flags содержит SV_GMAGIC.

char*  sv_2pvbyte      (SV *sv, STRLEN *const lp)
char*  sv_2pvbyte_flags(SV *sv, STRLEN *const lp, const U32 flags)
sv_2pvutf8
sv_2pvutf8_flags

Эти функции реализуют различные формы макросов "SvPVutf8" в perlapi. Макросы являются предпочтительным интерфейсом.

Они возвращают указатель на UTF-8-кодированное представление SV и устанавливают *lp на его длину в байтах. Они могут привести к повышению SV до UTF-8 как побочному эффекту.

Различия заключаются в том, что обычные sv_2pvutf8 всегда обрабатывают «магию получения»; и sv_2pvutf8_flags обрабатывают «магию получения» только в том случае, если flags содержит SV_GMAGIC.

char*  sv_2pvutf8      (SV *sv, STRLEN *const lp)
char*  sv_2pvutf8_flags(SV *sv, STRLEN *const lp, const U32 flags)
sv_2uv_flags

Возвращает беззнаковое целое значение SV, выполняя необходимые преобразования строки. Если у flags установлен бит SV_GMAGIC, выполняет mg_get() вначале. Обычно используется через макросы SvUV(sv) и SvUVx(sv).

UV  sv_2uv_flags(SV *const sv, const I32 flags)
SvAMAGIC

Возвращает логическое значение, указывающее, включена ли перегрузка (активная магия) для sv или нет.

bool  SvAMAGIC(SV * sv)
sv_backoff

Удаляет любой смещение строки. Обычно следует использовать макрос-обёртку SvOOK_off.

void  sv_backoff(SV *const sv)
sv_bless

Благословляет SV в указанный пакет. SV должен быть RV. Пакет должен быть обозначен своим хранилищем (см. "gv_stashpv"). Счётчик ссылок SV не изменяется.

SV*  sv_bless(SV *const sv, HV *const stash)
sv_catpv
sv_catpv_flags
sv_catpv_mg
sv_catpv_nomg

Эти функции конкатенируют строку NUL, завершённую символом sstr, в конец строки, находящейся в SV. Если у SV установлен флаг UTF-8, то добавляемые байты должны быть валидным UTF-8.

Они отличаются только тем, как обрабатывают магию:

sv_catpv_mg выполняет магию «получения» и «установки».

sv_catpv выполняет только магию «получения».

sv_catpv_nomg пропускает всю магию.

sv_catpv_flags имеет дополнительный параметр flags, который позволяет указать любую комбинацию обработки магии (используя SV_GMAGIC и/или SV_SMAGIC), а также переопределить обработку UTF-8. Передача флага SV_CATUTF8 принудительно интерпретирует добавляемую строку как UTF-8; передача флага SV_CATBYTES интерпретирует её как просто байты. Необходимое преобразование в UTF-8 может быть применено к SV или добавляемой строке.

void  sv_catpv      (SV *const dsv, const char* sstr)
void  sv_catpv_flags(SV *dsv, const char *sstr, const I32 flags)
void  sv_catpv_mg   (SV *const dsv, const char *const sstr)
void  sv_catpv_nomg (SV *const dsv, const char* sstr)
END_OF_DOCUMENT_MARKER
sv_catpvf
sv_catpvf_nocontext
sv_catpvf_mg
sv_catpvf_mg_nocontext

Эти функции обрабатывают свои аргументы, как sprintf, и добавляют отформатированный вывод в SV. Как и sv_vcatpvfn, переупорядочивание аргументов не поддерживается, если функция вызывается с непустым списком аргументов в стиле C.

Если добавленные данные содержат «широкие» символы (включая, но не ограничиваясь, SVs с PV в формате UTF-8, отформатированном с %s, и символы >255, отформатированные с %c), исходный SV может быть обновлён до UTF-8.

Если исходный SV был в формате UTF-8, шаблон должен быть валидным UTF-8; если исходный SV был байтовым массивом, шаблон также должен быть валидным.

Все функции выполняют магию «get», но только sv_catpvf_mg и sv_catpvf_mg_nocontext выполняют магию «set».

sv_catpvf_nocontext и sv_catpvf_mg_nocontext не принимают параметр контекста потока (aTHX), поэтому используются в ситуациях, когда у вызывающего кода нет контекста потока.

ПРИМЕЧАНИЕ: sv_catpvf необходимо вызывать явно как Perl_sv_catpvf с параметром aTHX_.

ПРИМЕЧАНИЕ: sv_catpvf_mg необходимо вызывать явно как Perl_sv_catpvf_mg с параметром aTHX_.

void  Perl_sv_catpvf        (pTHX_ SV *const sv,
                             const char *const pat, ...)
void  sv_catpvf_nocontext   (SV *const sv, const char *const pat,
                             ...)
void  Perl_sv_catpvf_mg     (pTHX_ SV *const sv,
                             const char *const pat, ...)
void  sv_catpvf_mg_nocontext(SV *const sv, const char *const pat,
                             ...)
sv_catpvn
sv_catpvn_flags
sv_catpvn_mg
sv_catpvn_nomg

Эти функции конкатенируют len байтов строки, начиная с ptr, в конец строки, которая находится в dsv. Вызывающий код должен убедиться, что ptr содержит как минимум len байтов.

Для всех функций, кроме sv_catpvn_flags, предполагается, что добавляемая строка является валидным UTF-8, если у SV установлен флаг UTF-8, и строкой байтов в противном случае.

Они различаются:

sv_catpvn_mg выполняет магию «get» и «set» для dsv.

sv_catpvn выполняет только магию «get».

sv_catpvn_nomg пропускает всю магию.

sv_catpvn_flags имеет дополнительный параметр flags, который позволяет указать любую комбинацию обработки магии (используя SV_GMAGIC и/или SV_SMAGIC) и переопределить обработку UTF-8. Передавая флаг SV_CATBYTES, добавляемая строка интерпретируется как обычные байты; передавая флаг SV_CATUTF8, она интерпретируется как UTF-8, и dsv будет обновлён до UTF-8, если необходимо.

sv_catpvn, sv_catpvn_mg, и sv_catpvn_nomg реализованы с помощью sv_catpvn_flags.

void  sv_catpvn      (SV *dsv, const char *sstr, STRLEN len)
void  sv_catpvn_flags(SV *const dsv, const char *sstr,
                      const STRLEN len, const I32 flags)
void  sv_catpvn_mg   (SV *dsv, const char *sstr, STRLEN len)
void  sv_catpvn_nomg (SV *dsv, const char *sstr, STRLEN len)
sv_catpvs

Аналогично sv_catpvn, но принимает литеральную строку вместо пары «строка/длина».

void  sv_catpvs(SV* sv, "literal string")
sv_catpvs_flags

Аналогично sv_catpvn_flags, но принимает литеральную строку вместо пары «строка/длина».

void  sv_catpvs_flags(SV* sv, "literal string", I32 flags)
sv_catpvs_mg

Аналогично sv_catpvn_mg, но принимает литеральную строку вместо пары «строка/длина».

void  sv_catpvs_mg(SV* sv, "literal string")
sv_catpvs_nomg

Аналогично sv_catpvn_nomg, но принимает литеральную строку вместо пары «строка/длина».

void  sv_catpvs_nomg(SV* sv, "literal string")
sv_catsv
sv_catsv_flags
sv_catsv_mg
sv_catsv_nomg

Эти функции конкатенируют строку из SV sstr в конец строки в SV dsv. Если sstr равно null, эти функции являются бездействующими; в противном случае изменяется только dsv.

Они отличаются только выполняемой магией:

sv_catsv_mg выполняет магию «get» для обоих SV перед копированием и магию «set» для dsv после копирования.

sv_catsv выполняет только магию «get» для обоих SV.

sv_catsv_nomg пропускает всю магию.

sv_catsv_flags имеет дополнительный параметр flags, который позволяет использовать SV_GMAGIC и/или SV_SMAGIC для указания любой комбинации обработки магии (хотя у обоих или ни у одного SV будет применена магия «get»).

sv_catsv, sv_catsv_mg, и sv_catsv_nomg реализованы с помощью sv_catsv_flags.

void  sv_catsv      (SV *dsv, SV *sstr)
void  sv_catsv_flags(SV *const dsv, SV *const sstr,
                     const I32 flags)
void  sv_catsv_mg   (SV *dsv, SV *sstr)
void  sv_catsv_nomg (SV *dsv, SV *sstr)
sv_chop

Эффективное удаление символов из начала буфера строки. SvPOK(sv), или, по крайней мере, SvPOKp(sv), должны быть истинными, а ptr должен указывать на место внутри буфера строки. ptr становится первым символом скорректированной строки. Использует хак OOK. После возврата из функции, только SvPOK(sv) и SvPOKp(sv) из флагов OK будут истинными.

Внимание: после возврата из этой функции ptr и SvPVX_const(sv) могут больше не ссылаться на один и тот же фрагмент данных.

Невероятное сходство названия этой функции с оператором Perl's chop совершенно случайно. Эта функция работает слева направо; chop работает справа налево.

void  sv_chop(SV *const sv, const char *const ptr)
sv_clear

Очистка SV: вызов любых деструкторов, освобождение используемой памяти и освобождение самого тела. Голова SV не освобождается, хотя её тип устанавливается в все 1, чтобы случайно не предполагалось, что она жива во время глобального уничтожения и т. д. Эта функция должна вызываться только когда REFCNT равно нулю. В большинстве случаев вы захотите вызвать sv_free() (или её макро-обёртку SvREFCNT_dec).

void  sv_clear(SV *const orig_sv)
sv_cmp

Сравнение строк в двух SVs. Возвращает -1, 0 или 1, указывающие, меньше, равно или больше ли строка в sv1 строки в sv2. Поддерживает UTF-8 и 'use bytes', обрабатывает магию get и при необходимости приведёт свои аргументы к строкам. См. также "sv_cmp_locale".

I32  sv_cmp(SV *const sv1, SV *const sv2)
sv_cmp_flags

Сравнение строк в двух SVs. Возвращает -1, 0 или 1, указывающие, меньше, равно или больше ли строка в sv1 строки в sv2. Поддерживает UTF-8 и 'use bytes', и при необходимости приведёт свои аргументы к строкам. Если флаги содержат бит SV_GMAGIC, обрабатывает магию get. См. также "sv_cmp_locale_flags".

I32  sv_cmp_flags(SV *const sv1, SV *const sv2, const U32 flags)
sv_cmp_locale

Сравнение строк в двух SVs с учётом локали. Поддерживает UTF-8 и 'use bytes', обрабатывает магию get и при необходимости приведёт свои аргументы к строкам. См. также "sv_cmp".

I32  sv_cmp_locale(SV *const sv1, SV *const sv2)
sv_cmp_locale_flags

Сравнение строк в двух SVs с учётом локали. Поддерживает UTF-8 и 'use bytes', и при необходимости приведёт свои аргументы к строкам. Если флаги содержат SV_GMAGIC, обрабатывает магию get. См. также "sv_cmp_flags".

I32  sv_cmp_locale_flags(SV *const sv1, SV *const sv2,
                         const U32 flags)
sv_collxfrm

Этот вызов sv_collxfrm_flags с флагом SV_GMAGIC. См. "sv_collxfrm_flags".

char*  sv_collxfrm(SV *const sv, STRLEN *const nxp)
sv_collxfrm_flags

Добавляет магию преобразования сортировки в SV, если её нет. Если флаги содержат SV_GMAGIC, обрабатывает магию get.

Любая переменная скаляра может содержать магию PERL_MAGIC_collxfrm, которая содержит скалярные данные переменной, но преобразована в такой формат, что обычное сравнение памяти может использоваться для сравнения данных в соответствии с настройками локали.

char*  sv_collxfrm_flags(SV *const sv, STRLEN *const nxp,
                         I32 const flags)
sv_copypv
sv_copypv_nomg
sv_copypv_flags

Эти функции копируют строковое представление исходного SV в целевой SV. Автоматически выполняют преобразование числовых значений в строки. Гарантируется сохранение флага UTF8 даже от перегруженных объектов. Похожи по природе на sv_2pv[_flags], но работают непосредственно со SV вместо только строки. В основном они используют "sv_2pv_flags" для выполнения работы, за исключением случаев, когда это приведёт к потере UTF-8'ности PV.

Три варианта различаются только тем, выполняется ли магия «get» для sv. sv_copypv_nomg пропускает «get» магию; sv_copypv выполняет её; и sv_copypv_flags выполняет её (если бит SV_GMAGIC установлен в flags) или нет (если этот бит сброшен).

void  sv_copypv      (SV *const dsv, SV *const ssv)
void  sv_copypv_nomg (SV *const dsv, SV *const ssv)
void  sv_copypv_flags(SV *const dsv, SV *const ssv,
                      const I32 flags)
SvCUR

Возвращает длину PV внутри SV в байтах. Обратите внимание, что это может не соответствовать Perl's length; для этого используйте sv_len_utf8(sv). См. также "SvLEN".

STRLEN  SvCUR(SV* sv)
SvCUR_set

Устанавливает текущую длину C-строки в SV в байтах. См. "SvCUR" и SvIV_set>.

void  SvCUR_set(SV* sv, STRLEN len)
sv_dec
sv_dec_nomg

Эти функции автоматически уменьшают значение в SV, выполняя преобразование строки в число, если это необходимо. Обе функции обрабатывают перегрузку операторов.

Они различаются только тем:

sv_dec обрабатывает магию «get»; sv_dec_nomg пропускает магию «get».

void  sv_dec(SV *const sv)
sv_derived_from

Точно так же, как "sv_derived_from_pv", но не принимает параметр flags.

bool  sv_derived_from(SV* sv, const char *const name)
sv_derived_from_pv

Точно так же, как "sv_derived_from_pvn", но принимает нуль-терминированную строку вместо пары «строка/длина».

bool  sv_derived_from_pv(SV* sv, const char *const name,
                         U32 flags)
sv_derived_from_pvn

Возвращает булево значение, указывающее, получен ли SV из указанного класса на уровне C. Для проверки производного класса на уровне Perl вызовите isa() как обычный Perl-метод.

В настоящее время единственное значимое значение для flags — SVf_UTF8.

bool  sv_derived_from_pvn(SV* sv, const char *const name,
                          const STRLEN len, U32 flags)
sv_derived_from_sv

Точно так же, как "sv_derived_from_pvn", но принимает имя строки в виде SV вместо пары «строка/длина». Этот вариант рекомендуется.

bool  sv_derived_from_sv(SV* sv, SV *namesv, U32 flags)
sv_does

Аналогично "sv_does_pv", но не принимает параметр flags.

bool  sv_does(SV* sv, const char *const name)
sv_does_pv

Как "sv_does_sv", но принимает строку с завершающим нулём вместо SV.

bool  sv_does_pv(SV* sv, const char *const name, U32 flags)
sv_does_pvn

Как "sv_does_sv", но принимает пару "строка/длина" вместо SV.

bool  sv_does_pvn(SV* sv, const char *const name,
                  const STRLEN len, U32 flags)
sv_does_sv

Возвращает булево значение, указывающее, выполняет ли SV определённую, именованную роль. SV может быть объектом Perl или именем класса Perl.

bool  sv_does_sv(SV* sv, SV* namesv, U32 flags)
SvEND

Возвращает указатель на место сразу после последнего символа в строке, которая находится в SV, где обычно находится конечный символ NUL (хотя перловы скаляры строго этого не требуют). См. "SvCUR". Доступ к символу как *(SvEND(sv)).

Предупреждение: Если SvCUR равно SvLEN, то SvEND указывает на невыделенную память.

char*  SvEND(SV* sv)
sv_eq

Возвращает булево значение, указывающее, идентичны ли строки в двух SV. Поддерживает UTF-8 и 'use bytes', обрабатывает get-магию и при необходимости приводит аргументы к строкам.

Данная функция не обрабатывает перегрузку операторов. Для версии, которая это делает, см. sv_streq.

I32  sv_eq(SV* sv1, SV* sv2)
sv_eq_flags

Возвращает булево значение, указывающее, идентичны ли строки в двух SV. Поддерживает UTF-8 и 'use bytes', приводит аргументы к строкам при необходимости. Если флаг SV_GMAGIC установлен, то обрабатывает get-магию.

Данная функция не обрабатывает перегрузку операторов. Для версии, которая это делает, см. sv_streq_flags.

I32  sv_eq_flags(SV* sv1, SV* sv2, const U32 flags)
sv_force_normal

Отменяет различные виды имитации для SV: если PV – это общая строка, создаёт её собственную копию; если мы – ссылка, прекращаем ссылку; если мы – глоб, понижаем его до xpvmg. См. также "sv_force_normal_flags".

void  sv_force_normal(SV *sv)
sv_force_normal_flags

Отменяет различные виды имитации для SV, где имитация означает "больше чем" строка: если PV – это общая строка, создаёт её собственную копию; если мы – ссылка, прекращаем ссылку; если мы – глоб, понижаем его до xpvmg; если мы – скаляр копирования при записи, это время записи, когда мы делаем копию, и также используется локально; если это v-строка, снимаем магию v-строки. Если SV_COW_DROP_PV установлен, тогда скаляр копирования при записи оставляет свой буфер PV (если есть) и становится SvPOK_off вместо создания копии. (Используется, когда этот скаляр будет установлен на другое значение.) Кроме того, параметр flags передаётся в sv_unref_flags() при отмене ссылки. sv_force_normal вызывает эту функцию с флагами, установленными в 0.

Ожидается, что эта функция будет использоваться для сигнализации Perl о том, что этот SV собирается быть изменён, и любая дополнительная учётная запись должна быть сделана. Следовательно, она генерирует ошибку при чтении только для чтения.

void  sv_force_normal_flags(SV *const sv, const U32 flags)
sv_free

Уменьшает счётчик ссылок SV, и если он падает до нуля, вызывает sv_clear для вызова деструкторов и освобождения любой памяти, используемой телом; в конечном счёте, освобождая голову SV. Обычно вызывается через обертывающую макрос SvREFCNT_dec.

void  sv_free(SV *const sv)
SvGAMAGIC

Возвращает true, если SV имеет магию get или перегрузку. Если одно из них верно, то скаляр является активными данными и может возвращать новое значение каждый раз при доступе. Поэтому необходимо быть осторожным, чтобы читать его только один раз за операцию логики пользователя и работать с этим возвращённым значением. Если ни то, ни другое неверно, то значение скаляра не может быть изменено, пока не будет записано.

U32  SvGAMAGIC(SV* sv)
SvGETMAGIC

Вызывает "mg_get" для SV, если у него есть магия 'get'. Например, это вызовет FETCH для привязанной переменной. Эта макрос вычисляет свой аргумент более чем один раз.

void  SvGETMAGIC(SV* sv)
sv_gets

Получает строку из дескриптора файла и сохраняет её в SV, необязательно добавляя к текущей сохранённой строке. Если append не равно 0, то строка добавляется к SV вместо перезаписи. append должен быть установлен на смещение байта, с которого должна начинаться добавленная строка в SV (обычно, SvCUR(sv) – подходящий выбор).

char*  sv_gets(SV *const sv, PerlIO *const fp, I32 append)
sv_get_backrefs

ПРИМЕЧАНИЕ: sv_get_backrefs является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Если sv является целью слабой ссылки, то возвращает структуру обратных ссылок, связанную с sv; в противном случае возвращает NULL.

При возвращении непустого результата тип возвращаемого значения важен. Если это AV, то элементы AV – это слабые ссылки RV, указывающие на этот элемент. Если это любой другой тип, то сам элемент – слабая ссылка.

См. также Perl_sv_add_backref(), Perl_sv_del_backref(), Perl_sv_kill_backrefs()

SV*  sv_get_backrefs(SV *const sv)
SvGROW

Расширяет буфер символов в SV, чтобы он мог вместить указанное количество байтов (не забудьте зарезервировать место для дополнительного конечного символа NUL). Вызывает sv_grow для выполнения расширения при необходимости. Возвращает указатель на буфер символов. SV должен быть типа >= SVt_PV. Альтернативный вариант – вызвать sv_grow если вы не уверены в типе SV.

Вы можете ошибочно подумать, что len – это количество байтов, которое нужно добавить к существующему размеру, но на самом деле это общий размер sv должен быть.

char *  SvGROW(SV* sv, STRLEN len)
sv_inc
sv_inc_nomg

Эти функции автоматически увеличивают значение в SV, выполняя преобразование строки в число при необходимости. Обе функции обрабатывают перегрузку операторов.

Они отличаются только тем, что sv_inc выполняет магию 'get'; sv_inc_nomg пропускает любую магию.

void  sv_inc(SV *const sv)
sv_insert

Вставляет и/или заменяет строку в указанном смещении/длине внутри SV. Аналогично функции Perl substr(), где littlelen байтов, начинающихся с little, заменяют len байтов строки в bigstr, начиная с offset. Обрабатывает магию get.

void  sv_insert(SV *const bigstr, const STRLEN offset,
                const STRLEN len, const char *const little,
                const STRLEN littlelen)
sv_insert_flags

То же самое, что и sv_insert, но дополнительные flags передаются в SvPV_force_flags функция, которая применяется к bigstr.

void  sv_insert_flags(SV *const bigstr, const STRLEN offset,
                      const STRLEN len, const char *little,
                      const STRLEN littlelen, const U32 flags)
SvIOK

Возвращает значение U32, указывающее, содержит ли SV целое число.

U32  SvIOK(SV* sv)
SvIOK_notUV

Возвращает булево значение, указывающее, содержит ли SV целое число со знаком.

bool  SvIOK_notUV(SV* sv)
SvIOK_off

Снимает статус IV для SV.

void  SvIOK_off(SV* sv)
SvIOK_on

Указывает SV, что это целое число.

void  SvIOK_on(SV* sv)
SvIOK_only

Указывает SV, что это целое число и отключает все другие OK биты.

void  SvIOK_only(SV* sv)
SvIOK_only_UV

Указывает SV, что это целое число без знака, и отключает все другие OK биты.

void  SvIOK_only_UV(SV* sv)
SvIOKp

Возвращает значение U32, указывающее, содержит ли SV целое число. Проверяет частное значение. Используйте SvIOK вместо этого.

U32  SvIOKp(SV* sv)
SvIOK_UV

Возвращает булево значение, указывающее, содержит ли SV целое число, которое должно интерпретироваться как без знака. Целое число без знака, которое находится в диапазоне как IV, так и UV, может быть помечено как SvUOK или SvIOK.

bool  SvIOK_UV(SV* sv)
sv_isa

Возвращает булево значение, указывающее, благословлен ли SV в указанный класс.

Это не проверяет подклассы или перегрузку методов. Используйте sv_isa_sv для проверки отношения наследования таким же образом, как и оператор isa, учитывая перегрузку методов isa(); или sv_derived_from_sv для прямой проверки фактического типа объекта.

int  sv_isa(SV* sv, const char *const name)
sv_isa_sv

ПРИМЕЧАНИЕ: sv_isa_sv является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Возвращает булево значение, указывающее, является ли SV ссылкой на объект и получен ли он от указанного класса, учитывая возможную перегрузку методов isa(). Возвращает false, если sv не является ссылкой на объект или не получен от указанного класса.

Это функция, используемая для реализации поведения оператора isa.

Не вызывает магию на sv.

Не следует путать с более старой функцией sv_isa, которая не использует перегруженный метод isa(), а также не проверяет наследование.

bool  sv_isa_sv(SV* sv, SV* namesv)
SvIsBOOL

Возвращает true, если SV является одним из специальных булевых констант (PL_sv_yes или PL_sv_no) или является обычным SV, последняя установка которого сохранила копию одного из них.

bool  SvIsBOOL(SV* sv)
SvIsCOW

Возвращает значение U32, указывающее, является ли SV копированием при записи (общие ключи хэша скаляров или полные скаляры копирования при записи, если для COW настроено 5.9.0).

U32  SvIsCOW(SV* sv)
SvIsCOW_shared_hash

Возвращает булево значение, указывающее, является ли SV скаляром общего ключа хэша копирования при записи.

bool  SvIsCOW_shared_hash(SV* sv)
sv_isobject

Возвращает булево значение, указывающее, является ли SV RV, указывающим на благословлённый объект. Если SV не является RV или объект не благословлён, то это вернёт false.

int  sv_isobject(SV* sv)
SvIV
SvIVx
SvIV_nomg

Эти функции приводят указанный SV к типу IV и возвращают его. Возвращаемое значение во многих случаях будет сохранено в слоте IV sv, но не во всех. (Используйте "sv_setiv" для того, чтобы убедиться, что это произойдёт).

SvIVx отличается от других тем, что гарантированно вычисляет sv ровно один раз; другие могут вычислить его несколько раз. Используйте этот вариант только если sv — это выражение со побочными эффектами, в противном случае используйте более эффективную функцию SvIV.

SvIV_nomg эквивалентна SvIV, но не выполняет магию 'get'.

IV  SvIV(SV* sv)
SvIV_set

Устанавливает значение указателя IV в sv на val. Можно выполнить ту же функцию с помощью присваивания lvalue к SvIVX. Однако в будущих версиях Perl будет более эффективно использовать SvIV_set вместо присваивания lvalue к SvIVX.

void  SvIV_set(SV* sv, IV val)
SvIVX

Возвращает исходное значение в слоте IV SV без проверок или преобразований. Используйте только когда уверены, что SvIOK истинно. Смотрите также "SvIV".

IV  SvIVX(SV* sv)
SvLEN

Возвращает размер буфера строки в SV, не включая часть, приходящуюся на SvOOK. См. "SvCUR".

STRLEN  SvLEN(SV* sv)
sv_len

Возвращает длину строки в SV. Обрабатывает магию и преобразование типов и устанавливает флаг UTF8 соответствующим образом. См. также "SvCUR", который предоставляет прямой доступ к слоту xpv_cur.

STRLEN  sv_len(SV *const sv)
SvLEN_set

Устанавливает размер буфера строки для SV. См. "SvLEN".

void  SvLEN_set(SV* sv, STRLEN len)
sv_len_utf8
sv_len_utf8_nomg

Эти функции возвращают количество символов в строке в SV, считая широкие байты UTF-8 как один символ. Обе функции обрабатывают преобразование типов. Они различаются только тем, что sv_len_utf8 выполняет магию 'get'; sv_len_utf8_nomg пропускает всю магию.

STRLEN  sv_len_utf8(SV *const sv)
SvLOCK

Получает блокировку взаимного исключения для sv, если соответствующий модуль загружен.

void  SvLOCK(SV* sv)
sv_magic

Добавляет магию к SV. В случае необходимости сначала повышает sv до типа SVt_PVMG, затем добавляет новую магическую запись типа how в начало списка магии.

См. "sv_magicext" (которое теперь вызывает sv_magic) для описания обработки аргументов name и namlen.

Для добавления магии к SvREADONLY SV и добавления нескольких экземпляров той же how необходимо использовать sv_magicext.

void  sv_magic(SV *const sv, SV *const obj, const int how,
               const char *const name, const I32 namlen)
sv_magicext

Добавляет магию к SV, если необходимо, повышая его тип. Применяет предоставленный vtable и возвращает указатель на добавленную магию.

Обратите внимание, что sv_magicext позволяет вещи, которые sv_magic не допускает. В частности, вы можете добавлять магию к SvREADONLY SV и добавлять несколько экземпляров одной и той же how.

Если namlen больше нуля, то делается копия name, если namlen равно нулю, то name сохраняется как есть. Также, если (name && namlen == HEf_SVKEY) истинно, то name предполагается содержать указатель на SV и сохраняется как есть, с увеличенным значением REFCNT.

(Теперь это используется как подпрограмма sv_magic.)

MAGIC *  sv_magicext(SV *const sv, SV *const obj, const int how,
                     const MGVTBL *const vtbl,
                     const char *const name, const I32 namlen)
SvMAGIC_set

Устанавливает значение указателя MAGIC в sv на val. См. "SvIV_set".

void  SvMAGIC_set(SV* sv, MAGIC* val)
sv_mortalcopy

Создаёт новый SV, являющийся копией исходного SV (используя sv_setsv). Новый SV помечается как временный. Он будет уничтожен «скоро», либо явным вызовом FREETMPS, либо неявным вызовом на границах операторов. См. также "sv_newmortal" и "sv_2mortal".

SV*  sv_mortalcopy(SV *const oldsv)
sv_mortalcopy_flags

Как sv_mortalcopy, но дополнительные flags передаются в sv_setsv_flags.

SV*  sv_mortalcopy_flags(SV *const oldsv, U32 flags)
sv_newmortal

Создаёт новый нулевой SV, который является временным. Счётчик ссылок SV устанавливается в 1. Он будет уничтожен «скоро», либо явным вызовом FREETMPS, либо неявным вызовом на границах операторов. См. также "sv_mortalcopy" и "sv_2mortal".

SV*  sv_newmortal()
SvNIOK

Возвращает значение U32, указывающее, содержит ли SV число, целое число или двойное значение.

U32  SvNIOK(SV* sv)
SvNIOK_off

Снимает флаги NV/IV для SV.

void  SvNIOK_off(SV* sv)
SvNIOKp

Возвращает значение U32, указывающее, содержит ли SV число, целое число или двойное значение. Проверяет приватное значение. Используйте SvNIOK вместо этого.

U32  SvNIOKp(SV* sv)
SvNOK

Возвращает значение U32, указывающее, содержит ли SV двойное значение.

U32  SvNOK(SV* sv)
SvNOK_off

Снимает флаг NV для SV.

void  SvNOK_off(SV* sv)
SvNOK_on

Указывает SV, что он содержит двойное значение.

void  SvNOK_on(SV* sv)
SvNOK_only

Указывает SV, что он содержит двойное значение и отключает все другие биты OK.

void  SvNOK_only(SV* sv)
SvNOKp

Возвращает значение U32, указывающее, содержит ли SV двойное значение. Проверяет приватное значение. Используйте SvNOK вместо этого.

U32  SvNOKp(SV* sv)
sv_nolocking

DEPRECATED! Планируется удалить sv_nolocking из будущей версии Perl. Не используйте в новом коде; удалите из существующего.

Псевдофункция, которая "блокирует" SV, если модуль блокировки отсутствует. Существует для предотвращения проверки на указатель функции NULL и для предотвращения предупреждений в некоторых режимах строгости.

"Заменена" на sv_nosharing().

void  sv_nolocking(SV *sv)
sv_nounlocking

DEPRECATED! Планируется удалить sv_nounlocking из будущей версии Perl. Не используйте в новом коде; удалите из существующего.

Псевдофункция, которая "разблокирует" SV, если модуль блокировки отсутствует. Существует для предотвращения проверки на указатель функции NULL и для предотвращения предупреждений в некоторых режимах строгости.

"Заменена" на sv_nosharing().

void  sv_nounlocking(SV *sv)
sv_numeq

Удобный способ вызвать sv_numeq_flags с флагом SV_GMAGIC. Эта функция по сути ведет себя как Perl-код $sv1 == $sv2.

bool  sv_numeq(SV* sv1, SV* sv2)
sv_numeq_flags

Возвращает булево значение, указывающее, равны ли числа в двух SV. Если в аргументе флагов установлен бит SV_GMAGIC, то обрабатывается и магия 'get'. Преобразует аргументы в числа при необходимости. Обрабатывает NULL как undef.

Если в флагах не установлен бит SV_SKIP_OVERLOAD, то будет выполнена попытка перегрузки оператора ==. Если такая перегрузка не существует или флаг установлен, то вместо неё будет использовано обычное числовое сравнение.

bool  sv_numeq_flags(SV* sv1, SV* sv2, const U32 flags)
SvNV
SvNVx
SvNV_nomg

Эти функции приводят указанный SV к типу NV и возвращают его. Возвращаемое значение во многих случаях будет сохранено в слоте NV sv, но не во всех. (Используйте "sv_setnv" для того, чтобы убедиться, что это произойдёт).

SvNVx отличается от других тем, что гарантированно вычисляет sv ровно один раз; другие могут вычислить его несколько раз. Используйте этот вариант только если sv — это выражение со побочными эффектами, в противном случае используйте более эффективную функцию SvNV.

SvNV_nomg эквивалентна SvNV, но не выполняет магию 'get'.

NV  SvNV(SV* sv)
SvNV_set

Устанавливает значение указателя NV в sv на val. См. "SvIV_set".

void  SvNV_set(SV* sv, NV val)
SvNVX

Возвращает исходное значение в слоте NV SV без проверок или преобразований. Используйте только когда уверены, что SvNOK истинно. См. также "SvNV".

NV  SvNVX(SV* sv)
SvOK

Возвращает значение U32, указывающее, определено ли значение. Это имеет смысл только для скаляров.

U32  SvOK(SV* sv)
SvOOK

Возвращает U32, указывающее, сдвинут ли указатель на буфер строки. Этот приём используется внутри для ускорения удаления символов из начала "SvPV". Когда SvOOK истинно, то начало выделенного буфера строки фактически смещено на SvOOK_offset() байтов относительно SvPVX. Раньше это смещение хранилось в SvIVX, но теперь хранится в свободной части буфера.

U32  SvOOK(SV* sv)
SvOOK_off

Удаляет любое смещение строки.

void  SvOOK_off(SV * sv)
SvOOK_offset

Считывает в len смещение от SvPVX до истинного начала выделенного буфера, которое будет отличным от нуля, если использовалась функция sv_chop для эффективного удаления символов из начала буфера. Реализовано как макрос, который принимает адрес len, который должен быть типа STRLEN. Вычисляет sv несколько раз. Устанавливает len в 0, если SvOOK(sv) ложно.

void  SvOOK_offset(SV*sv, STRLEN len)
SvPOK

Возвращает значение U32, указывающее, содержит ли SV строку символов.

U32  SvPOK(SV* sv)
SvPOK_off

Снимает флаг PV для SV.

void  SvPOK_off(SV* sv)
SvPOK_on

Указывает SV, что он содержит строку.

void  SvPOK_on(SV* sv)
SvPOK_only

Сообщает SV, что это строка, и отключает все остальные OK биты. Также отключит статус UTF-8.

void  SvPOK_only(SV* sv)
SvPOK_only_UTF8

Сообщает SV, что это строка, и отключает все остальные OK биты, сохраняя статус UTF-8 в прежнем состоянии.

void  SvPOK_only_UTF8(SV* sv)
SvPOKp

Возвращает значение типа U32, указывающее, содержит ли SV строку символов. Проверяет значение параметра private. Используйте SvPOK вместо этого.

U32  SvPOKp(SV* sv)
sv_pos_b2u

Преобразует значение, на которое указывает offsetp, из числа байтов от начала строки в число эквивалентных символов UTF-8. Обрабатывает магию и приведение типов.

Используйте sv_pos_b2u_flags вместо этого, которое правильно обрабатывает строки длиннее 2 Гб.

void  sv_pos_b2u(SV *const sv, I32 *const offsetp)
sv_pos_b2u_flags

Преобразует offset из числа байтов от начала строки в число эквивалентных символов UTF-8. Обрабатывает приведение типов. flags передается в SvPV_flags, и обычно должно быть SV_GMAGIC|SV_CONST_RETURN, чтобы обработать магию.

STRLEN  sv_pos_b2u_flags(SV *const sv, STRLEN const offset,
                         U32 flags)
sv_pos_u2b

Преобразует значение, на которое указывает offsetp, из числа символов UTF-8 от начала строки в число эквивалентных байтов; если lenp не равно нулю, то выполняет то же самое для lenp, но на этот раз начиная со смещения, а не с начала строки. Обрабатывает магию и приведение типов.

Используйте sv_pos_u2b_flags вместо этого, которое правильно обрабатывает строки длиннее 2 Гб.

void  sv_pos_u2b(SV *const sv, I32 *const offsetp,
                 I32 *const lenp)
sv_pos_u2b_flags

Преобразует смещение из числа символов UTF-8 от начала строки в число эквивалентных байтов; если lenp не равно нулю, то выполняет то же самое для lenp, но на этот раз начиная со offset, а не с начала строки. Обрабатывает приведение типов. flags передается в SvPV_flags, и обычно должно быть SV_GMAGIC|SV_CONST_RETURN, чтобы обработать магию.

STRLEN  sv_pos_u2b_flags(SV *const sv, STRLEN uoffset,
                         STRLEN *const lenp, U32 flags)
SvPV
SvPVx
SvPV_nomg
SvPV_nolen
SvPVx_nolen
SvPV_nomg_nolen
SvPV_mutable
SvPV_const
SvPVx_const
SvPV_nolen_const
SvPVx_nolen_const
SvPV_nomg_const
SvPV_nomg_const_nolen
SvPV_flags
SvPV_flags_const
SvPV_flags_mutable
SvPVbyte
SvPVbyte_nomg
SvPVbyte_nolen
SvPVbytex_nolen
SvPVbytex
SvPVbyte_or_null
SvPVbyte_or_null_nomg
SvPVutf8
SvPVutf8x
SvPVutf8_nomg
SvPVutf8_nolen
SvPVutf8_or_null
SvPVutf8_or_null_nomg

Все эти функции возвращают указатель на строку в sv, или строковое представление sv, если оно не содержит строку. SV может кэшировать строковое представление, становясь SvPOK.

Это очень базовая и распространенная операция, поэтому существует много слегка отличающихся вариантов.

Обратите внимание, что нет гарантии, что возвращаемое значение SvPV(sv), например, равно SvPVX(sv), или что SvPVX(sv) содержит корректные данные, или что последующие вызовы SvPV(sv) (или любого другого из этих вариантов) будут возвращать одно и то же значение указателя каждый раз. Это связано с тем, как обрабатываются такие вещи, как перегрузка и копирование при изменении. В этих случаях возвращаемое значение может указывать на временный буфер или что-то подобное. Если вам абсолютно необходимо, чтобы поле SvPVX было действительным (например, если вы хотите записать в него), обратитесь к "SvPV_force".

Различия между формами:

Формы без byte и utf8 в своём имени (например, SvPV или SvPV_nolen) могут раскрыть внутренний буфер строк SV. Если этот буфер состоит только из байтов 0-255 и содержит какие-либо байты выше 127, то вы ОБЯЗАНЫ обратиться к SvUTF8 для определения фактических кодовых точек, которые строка должна содержать. Как правило, предпочтительнее использовать SvPVbyte, SvPVutf8 и т. п. См. "Как передать строку Perl в библиотеку C?" в perlguts для получения более подробной информации.

Формы с flags в своём имени позволяют использовать параметр flags для указания обработки магической функции 'get' (установив флаг SV_GMAGIC) или пропуска обработки магической функции 'get' (сбросив его). Остальные формы обрабатывают магическую функцию 'get', за исключением форм с nomg в своём имени, которые пропускают её.

Формы, принимающие параметр len, устанавливают это переменную в длину в байтах полученной строки (это макросы, поэтому не используйте &len).

Формы с nolen в своём имени указывают, что у них нет параметра len. Их следует использовать только тогда, когда известно, что PV является строкой C, завершающейся нулевым байтом, без промежуточных нулевых байтов; или когда вам не важна её длина.

Формы с const в своём имени возвращают const char *, чтобы компилятор, возможно, пожаловался, если вы попытаетесь изменить содержимое строки (если вы не отбросите const).

Другие формы возвращают изменяемый указатель, чтобы строка могла быть изменена вызывающей стороной; это подчеркивается для форм с mutable в своём имени.

Формы, имя которых заканчивается на x, аналогичны соответствующим формам без x, но форма x гарантирует, что sv будет вычислено только один раз с незначительной потерей эффективности. Используйте её, если sv - выражение со побочными эффектами.

SvPVutf8 подобно SvPV, но преобразует sv в UTF-8, если это не UTF-8. Аналогично, другие формы с utf8 в своём имени соответствуют их соответствующим формам без.

SvPVutf8_or_null и SvPVutf8_or_null_nomg не имеют соответствующих форм без utf8. Вместо этого они подобны SvPVutf8_nomg, но когда sv не определено, они возвращают NULL.

SvPVbyte подобно SvPV, но преобразует sv в байтовое представление сначала, если оно закодировано в UTF-8. Если sv не может быть понижен с UTF-8, то происходит ошибка. Аналогично, другие формы с byte в своём имени соответствуют их соответствующим формам без.

SvPVbyte_or_null не имеет соответствующей формы без byte. Вместо этого она подобна SvPVbyte, но когда sv не определено, она возвращает NULL.

char*         SvPV                 (SV* sv, STRLEN len)
char*         SvPVx                (SV* sv, STRLEN len)
char*         SvPV_nomg            (SV* sv, STRLEN len)
char*         SvPV_nolen           (SV* sv)
char*         SvPVx_nolen          (SV* sv)
char*         SvPV_nomg_nolen      (SV* sv)
char*         SvPV_mutable         (SV* sv, STRLEN len)
const char*   SvPV_const           (SV* sv, STRLEN len)
const char*   SvPVx_const          (SV* sv, STRLEN len)
const char*   SvPV_nolen_const     (SV* sv)
const char*   SvPVx_nolen_const    (SV* sv)
const char*   SvPV_nomg_const      (SV* sv, STRLEN len)
const char*   SvPV_nomg_const_nolen(SV* sv)
char *        SvPV_flags           (SV * sv, STRLEN len,
                                    U32 flags)
const char *  SvPV_flags_const     (SV * sv, STRLEN len,
                                    U32 flags)
char *        SvPV_flags_mutable   (SV * sv, STRLEN len,
                                    U32 flags)
char*         SvPVbyte             (SV* sv, STRLEN len)
char*         SvPVbyte_nomg        (SV* sv, STRLEN len)
char*         SvPVbyte_nolen       (SV* sv)
char*         SvPVbytex_nolen      (SV* sv)
char*         SvPVbytex            (SV* sv, STRLEN len)
char*         SvPVbyte_or_null     (SV* sv, STRLEN len)
char*         SvPVbyte_or_null_nomg(SV* sv, STRLEN len)
char*         SvPVutf8             (SV* sv, STRLEN len)
char*         SvPVutf8x            (SV* sv, STRLEN len)
char*         SvPVutf8_nomg        (SV* sv, STRLEN len)
char*         SvPVutf8_nolen       (SV* sv)
char*         SvPVutf8_or_null     (SV* sv, STRLEN len)
char*         SvPVutf8_or_null_nomg(SV* sv, STRLEN len)
SvPVCLEAR

Обеспечивает, что sv является SVt_PV, что его SvCUR равно 0, и что он правильно завершается нулём. Эквивалентно sv_setpvs(""), но более эффективно.

char *  SvPVCLEAR(SV* sv)
SvPV_force
SvPV_force_nolen
SvPVx_force
SvPV_force_nomg
SvPV_force_nomg_nolen
SvPV_force_mutable
SvPV_force_flags
SvPV_force_flags_nolen
SvPV_force_flags_mutable
SvPVbyte_force
SvPVbytex_force
SvPVutf8_force
SvPVutf8x_force

Эти функции подобны "SvPV", возвращая строку в SV, но принудительно преобразуют SV в строку ("SvPOK"), и только в строку ("SvPOK_only"), любыми способами. Вам нужно использовать одну из этих force функций, если вы собираетесь обновить "SvPVX" напрямую.

Обратите внимание, что принудительное преобразование произвольного скалярного значения в обычный PV может потенциально удалить полезные данные из него. Например, если SV был SvROK, то ссылка будет уменьшать счётчик ссылок, а сам SV может быть преобразован в скаляр SvPOK со строковым буфером, содержащим значение типа "ARRAY(0x1234)".

Различия между формами:

Формы с flags в своём имени позволяют использовать параметр flags для указания выполнения магической функции 'get' (установив флаг SV_GMAGIC ) или пропуска выполнения магической функции 'get' (сбросив его). Другие формы выполняют магическую функцию 'get', за исключением форм с nomg в своём имени, которые её пропускают.

Формы, принимающие параметр len, устанавливают эту переменную в длину в байтах полученной строки (это макросы, поэтому не используйте &len).

Формы с nolen в своём имени указывают, что у них нет параметра len. Их следует использовать только тогда, когда известно, что PV является строкой C, завершающейся нулевым байтом, без промежуточных нулевых байтов; или когда вам не важна её длина.

Формы с mutable в своём имени по сути такие же, как и без него, но имя подчеркивает, что строка может быть изменена вызывающей стороной, что это верно во всех формах.

SvPVutf8_force подобно SvPV_force, но преобразует sv в UTF-8, если это не UTF-8.

SvPVutf8x_force подобно SvPVutf8_force, но гарантирует, что sv будет вычислено только один раз; используйте более эффективный SvPVutf8_force в противном случае.

SvPVbyte_force подобно SvPV_force, но преобразует sv в байтовое представление сначала, если оно закодировано в UTF-8. Если SV не может быть понижен с UTF-8, произойдет ошибка.

SvPVbytex_force подобно SvPVbyte_force, но гарантирует, что sv будет вычислено только один раз; используйте более эффективный SvPVbyte_force в противном случае.

char*  SvPV_force              (SV* sv, STRLEN len)
char*  SvPV_force_nolen        (SV* sv)
char*  SvPVx_force             (SV* sv, STRLEN len)
char*  SvPV_force_nomg         (SV* sv, STRLEN len)
char*  SvPV_force_nomg_nolen   (SV * sv)
char*  SvPV_force_mutable      (SV * sv, STRLEN len)
char*  SvPV_force_flags        (SV * sv, STRLEN len, U32 flags)
char*  SvPV_force_flags_nolen  (SV * sv, U32 flags)
char*  SvPV_force_flags_mutable(SV * sv, STRLEN len, U32 flags)
char*  SvPVbyte_force          (SV* sv, STRLEN len)
char*  SvPVbytex_force         (SV* sv, STRLEN len)
char*  SvPVutf8_force          (SV* sv, STRLEN len)
char*  SvPVutf8x_force         (SV* sv, STRLEN len)
SvPV_free

Освобождает буфер PV в sv, оставляя вещи в неустойчивом состоянии, поэтому следует использовать только в рамках более крупной операции

void  SvPV_free(SV * sv)
sv_pvn_force_flags

Получить осмысленную строку из SV каким-то образом. Если flags имеет установленный бит SV_GMAGIC, будет "mg_get" по sv, если это уместно, в противном случае — нет. sv_pvn_force и sv_pvn_force_nomg реализованы с помощью этой функции. Обычно вы хотите использовать различные макросы-обертки: см. "SvPV_force" и "SvPV_force_nomg".

char*  sv_pvn_force_flags(SV *const sv, STRLEN *const lp,
                          const U32 flags)
SvPV_renew

Микрооптимизация низкого уровня "SvGROW". В целом лучше использовать SvGROW вместо этого. Это потому, что SvPV_renew игнорирует потенциальные проблемы, которые SvGROW обрабатывает. sv должен иметь реальный PV, который не усложнен такими вещами, как COW. Использование SV_CHECK_THINKFIRST или SV_CHECK_THINKFIRST_COW_DROP перед вызовом этого должно его почистить, но почему бы просто не использовать SvGROW, если вы не уверены в происхождении?

void  SvPV_renew(SV* sv, STRLEN len)
SvPV_set

Вероятно, это не то, что вам нужно, вам, вероятно, нужна "sv_usepvn_flags" или "sv_setpvn" или "sv_setpvs".

Устанавливает значение указателя PV в sv на строку NUL-terminated, выделенную Perl val. См. также "SvIV_set".

Не забудьте освободить предыдущий буфер PV. Есть много вещей, которые нужно проверить. Следите за тем, что существующий указатель может быть вовлечён в copy-on-write или другие неприятности, поэтому выполните SvOOK_off(sv) и используйте sv_force_normal или SvPV_force (или проверьте флаг SvIsCOW) для того, чтобы убедиться, что это изменение безопасно. Затем, наконец, если это не COW, вызовите "SvPV_free" для освобождения предыдущего буфера PV.

void  SvPV_set(SV* sv, char* val)
SvPVX
SvPVXx
SvPVX_const
SvPVX_mutable

Эти функции возвращают указатель на физическую строку в SV. SV должен содержать строку. До версии 5.9.3 использование этих функций небезопасно, если тип SV >= SVt_PV.

Они также используются для хранения имени автозагружаемой подпрограммы в XS-подпрограмме AUTOLOAD. См. "Автозагрузка с XSUB" в perlguts.

SvPVXx идентична SvPVX.

SvPVX_mutable просто синоним для SvPVX, но его имя подчёркивает, что строка может быть изменена вызывающим кодом.

SvPVX_const отличается тем, что возвращаемое значение было приведено, чтобы компилятор жаловался, если вы попытаетесь изменить содержимое строки (если вы сами не отбросите const).

char*        SvPVX        (SV* sv)
char*        SvPVXx       (SV* sv)
const char*  SvPVX_const  (SV* sv)
char*        SvPVX_mutable(SV* sv)
SvPVXtrue

Примечание: этот макрос может вычислять sv более одного раза.

Возвращает булево значение, указывающее, содержит ли sv PV, который считается ИСТИННЫМ. FALSE возвращается, если sv не содержит PV, или если содержащийся в нём PV имеет нулевую длину или состоит только из символа '0'. Все остальные значения PV считаются ИСТИННЫМИ.

bool  SvPVXtrue(SV * sv)
SvREADONLY

Возвращает true, если аргумент является только для чтения, в противном случае — false. Доступно коду perl через Internals::SvREADONLY().

U32  SvREADONLY(SV* sv)
SvREADONLY_off

Отметить объект как не только для чтения. Точное значение зависит от типа объекта. Доступно коду perl через Internals::SvREADONLY().

U32  SvREADONLY_off(SV* sv)
SvREADONLY_on

Отметить объект как только для чтения. Точное значение зависит от типа объекта. Доступно коду perl через Internals::SvREADONLY().

U32  SvREADONLY_on(SV* sv)
sv_ref

Возвращает SV, описывающий, к чему ссылается переданный SV.

dst может быть SV, который нужно установить в описание, или NULL, в этом случае возвращается временный SV.

Если ob истинно и SV благословен, описанием является имя класса, в противном случае — тип SV, "SCALAR", "ARRAY" и т. д.

SV*  sv_ref(SV *dst, const SV *const sv, const int ob)
SvREFCNT

Возвращает значение счётчика ссылок объекта. Доступно коду perl через Internals::SvREFCNT().

U32  SvREFCNT(SV* sv)
SvREFCNT_dec
SvREFCNT_dec_NN

Эти функции уменьшают счётчик ссылок данного SV.

SvREFCNT_dec_NN может быть использовано только тогда, когда sv известно, что не NULL.

void  SvREFCNT_dec(SV *sv)
SvREFCNT_inc
SvREFCNT_inc_NN
SvREFCNT_inc_void
SvREFCNT_inc_void_NN
SvREFCNT_inc_simple
SvREFCNT_inc_simple_NN
SvREFCNT_inc_simple_void
SvREFCNT_inc_simple_void_NN

Все эти функции увеличивают счётчик ссылок данного SV. Те, у которых нет void в их именах, возвращают SV.

SvREFCNT_inc — базовая операция; остальные — оптимизации, если известны различные ограничения входных данных; следовательно, все могут быть заменены на SvREFCNT_inc.

SvREFCNT_inc_NN может быть использовано только если вы знаете, что sv не NULL. Поскольку нам не нужно проверять нулевое значение, это быстрее и меньше.

SvREFCNT_inc_void может быть использовано, если вам не нужно возвращаемое значение. Макрос не должен возвращать осмысленное значение.

SvREFCNT_inc_void_NN может быть использовано, если вам не нужно возвращаемое значение, и вы знаете, что sv не NULL. Макрос не должен возвращать осмысленное значение или проверять нулевое значение, поэтому он меньше и быстрее.

SvREFCNT_inc_simple может быть использовано только с выражениями без побочных эффектов. Поскольку нам не нужно хранить временное значение, это быстрее.

SvREFCNT_inc_simple_NN может быть использовано только с выражениями без побочных эффектов, и вы знаете, что sv не NULL. Поскольку нам не нужно хранить временное значение и проверять нулевое значение, это быстрее и меньше.

SvREFCNT_inc_simple_void может быть использовано только с выражениями без побочных эффектов и вам не нужно возвращаемое значение.

SvREFCNT_inc_simple_void_NN может быть использовано только с выражениями без побочных эффектов, вам не нужно возвращаемое значение, и вы знаете, что sv не NULL.

SV *  SvREFCNT_inc               (SV *sv)
SV *  SvREFCNT_inc_NN            (SV *sv)
void  SvREFCNT_inc_void          (SV *sv)
void  SvREFCNT_inc_void_NN       (SV* sv)
SV*   SvREFCNT_inc_simple        (SV* sv)
SV*   SvREFCNT_inc_simple_NN     (SV* sv)
void  SvREFCNT_inc_simple_void   (SV* sv)
void  SvREFCNT_inc_simple_void_NN(SV* sv)
sv_reftype

Возвращает строку, описывающую, к чему ссылается SV.

Если ob истинно и SV благословен, строкой является имя класса, в противном случае — тип SV, "SCALAR", "ARRAY" и т. д.

const char*  sv_reftype(const SV *const sv, const int ob)
sv_replace

Создать копию второго аргумента для первого аргумента, а затем удалить оригинал. Целевой SV физически принимает на себя владение телом исходного SV и наследует его флаги; однако, целевой SV сохраняет все свои собственные магические свойства, а любые магические свойства в исходном SV удаляются. Обратите внимание, что это специализированная операция копирования SV; в большинстве случаев вы захотите использовать sv_setsv или один из его многочисленных макросов-фронтов.

void  sv_replace(SV *const sv, SV *const nsv)
sv_report_used

Вывести содержимое всех SV, которые ещё не освобождены (средство отладки).

void  sv_report_used()
sv_reset

Базовая реализация функции reset Perl. Обратите внимание, что функция уровня perl устаревает.

void  sv_reset(const char* s, HV *const stash)
SvROK

Проверяет, является ли SV RV.

U32  SvROK(SV* sv)
SvROK_off

Сбрасывает статус RV SV.

void  SvROK_off(SV* sv)
SvROK_on

Устанавливает для SV статус RV.

void  SvROK_on(SV* sv)
SvRV

Разыменовывает RV для возврата SV.

SV*  SvRV(SV* sv)
SvRV_set

Устанавливает значение указателя RV в sv на val. См. "SvIV_set".

void  SvRV_set(SV* sv, SV* val)
sv_rvunweaken

Убирает ослабление ссылки: очищает флаг SvWEAKREF для этого RV; удаляет обратную ссылку на этот RV из массива обратных ссылок, связанных с целевым SV, увеличивает счётчик ссылок целевого SV. Безмолвно игнорирует undef и предупреждает о неслабых ссылках.

SV*  sv_rvunweaken(SV *const sv)
sv_rvweaken

Ослабить ссылку: установить флаг SvWEAKREF для этого RV; придать целевому SV PERL_MAGIC_backref магию, если она ещё не установлена; и добавить обратную ссылку на этот RV в массив обратных ссылок, связанных с этой магией. Если RV является магическим, будет вызван set magic после того, как RV будет очищен. Безмолвно игнорирует undef и предупреждает о ссылках, которые уже были ослаблены.

SV*  sv_rvweaken(SV *const sv)
sv_setbool
sv_setbool_mg

Эти функции устанавливают SV в булево значение true или false, если необходимо, производя повышение.

Они отличаются только тем, что sv_setbool_mg обрабатывает магию 'set'; sv_setbool — нет.

void  sv_setbool(SV *sv, bool b)
sv_setiv
sv_setiv_mg

Эти функции копируют целое число в заданный SV, повышая его при необходимости.

Они отличаются только тем, что sv_setiv_mg обрабатывает магию 'set'; sv_setiv — нет.

void  sv_setiv   (SV *const sv, const IV num)
void  sv_setiv_mg(SV *const sv, const IV i)
SvSETMAGIC

Вызывает "mg_set" для SV, если у него есть магия 'set'. Это необходимо после изменения скаляра, если это магическая переменная, например $|, или привязанная переменная (вызывает STORE). Этот макрос вычисляет свой аргумент более одного раза.

void  SvSETMAGIC(SV* sv)
sv_setnv
sv_setnv_mg

Эти функции копируют double в заданный SV, повышая его при необходимости.

Они отличаются только тем, что sv_setnv_mg обрабатывает магию 'set'; sv_setnv — нет.

void  sv_setnv(SV *const sv, const NV num)
sv_setpv
sv_setpv_mg
sv_setpvn
sv_setpvn_fresh
sv_setpvn_mg
sv_setpvs
sv_setpvs_mg

Эти функции копируют строку в SV sv, гарантируя, что она "SvPOK_only".

В формах pvs, строка должна быть C-литеральной строкой, заключённой в двойные кавычки.

В формах pvn, первый байт строки указан в ptr, а len указывает количество байтов для копирования, потенциально включая вложенные NUL символы.

В простых формах pv, ptr указывает на завершающуюся нулём C-строку. То есть, он указывает на первый байт строки, а копирование продолжается до первого встреченного NUL байта.

В формах, принимающих аргумент ptr, если он NULL, SV станет неопределённым.

Флаг UTF-8 этими функциями не изменяется. Гарантируется завершающий нулевой байт в результате.

Формы _mg обрабатывают магию «set»; другие формы пропускают всю магию.

sv_setpvn_fresh — урезанный аналог sv_setpvn, предназначенный ТОЛЬКО для использования со свежим SV, который был обновлён до SVt_PV, SVt_PVIV, SVt_PVNV или SVt_PVMG.

void  sv_setpv       (SV *const sv, const char *const ptr)
void  sv_setpv_mg    (SV *const sv, const char *const ptr)
void  sv_setpvn      (SV *const sv, const char *const ptr,
                      const STRLEN len)
void  sv_setpvn_fresh(SV *const sv, const char *const ptr,
                      const STRLEN len)
void  sv_setpvn_mg   (SV *const sv, const char *const ptr,
                      const STRLEN len)
void  sv_setpvs      (SV* sv, "literal string")
void  sv_setpvs_mg   (SV* sv, "literal string")
sv_setpvf
sv_setpvf_nocontext
sv_setpvf_mg
sv_setpvf_mg_nocontext

Они работают как "sv_catpvf", но копируют текст в SV вместо добавления.

Различия заключаются в следующем:

sv_setpvf_mg и sv_setpvf_mg_nocontext выполняют магию «set»; sv_setpvf и sv_setpvf_nocontext пропускают всю магию.

sv_setpvf_nocontext и sv_setpvf_mg_nocontext не принимают параметр контекста потока (aTHX), поэтому используются в ситуациях, когда у вызывающего процесса нет контекста потока.

ПРИМЕЧАНИЕ: sv_setpvf должен быть явно вызван как Perl_sv_setpvf с параметром aTHX_.

ПРИМЕЧАНИЕ: sv_setpvf_mg должен быть явно вызван как Perl_sv_setpvf_mg с параметром aTHX_.

void  Perl_sv_setpvf        (pTHX_ SV *const sv,
                             const char *const pat, ...)
void  sv_setpvf_nocontext   (SV *const sv, const char *const pat,
                             ...)
void  Perl_sv_setpvf_mg     (pTHX_ SV *const sv,
                             const char *const pat, ...)
void  sv_setpvf_mg_nocontext(SV *const sv, const char *const pat,
                             ...)
sv_setpviv
sv_setpviv_mg

DEPRECATED! Планируется удалить обе формы из будущих релизов Perl. Не используйте их в новом коде; удалите их из существующего кода.

Эти функции копируют целое число в заданный SV, обновляя также его строковое значение.

Они различаются только тем, что sv_setpviv_mg выполняет магию «set»; sv_setpviv пропускает магию.

void  sv_setpviv   (SV *const sv, const IV num)
void  sv_setpviv_mg(SV *const sv, const IV iv)
sv_setpv_bufsize

Устанавливает SV в строку длины cur байтов, с доступными по меньшей мере len байтами. Гарантирует наличие нулевого байта в SvEND. Возвращает указатель char * на буфер SvPV.

char  *  sv_setpv_bufsize(SV *const sv, const STRLEN cur,
                          const STRLEN len)
sv_setref_iv

Копирует целое число в новый SV, необязательно благословляя SV. Аргумент rv будет преобразован в RV. Этот RV будет изменён, чтобы указывать на новый SV. Аргумент classname указывает пакет для благословения. Установите classname в NULL, чтобы избежать благословения. Новый SV будет иметь счётчик ссылок 1, и RV будет возвращён.

SV*  sv_setref_iv(SV *const rv, const char *const classname,
                  const IV iv)
sv_setref_nv

Копирует двойное значение в новый SV, необязательно благословляя SV. Аргумент rv будет преобразован в RV. Этот RV будет изменён, чтобы указывать на новый SV. Аргумент classname указывает пакет для благословения. Установите classname в NULL, чтобы избежать благословения. Новый SV будет иметь счётчик ссылок 1, и RV будет возвращён.

SV*  sv_setref_nv(SV *const rv, const char *const classname,
                  const NV nv)
sv_setref_pv

Копирует указатель в новый SV, необязательно благословляя SV. Аргумент rv будет преобразован в RV. Этот RV будет изменён, чтобы указывать на новый SV. Если аргумент pv равен NULL, то PL_sv_undef будет помещён в SV. Аргумент classname указывает пакет для благословения. Установите classname в NULL, чтобы избежать благословения. Новый SV будет иметь счётчик ссылок 1, и RV будет возвращён.

Не используйте с другими типами Perl, такими как HV, AV, SV, CV, потому что эти объекты могут быть повреждены в процессе копирования указателя.

Обратите внимание, что sv_setref_pvn копирует строку, а эта функция копирует указатель.

SV*  sv_setref_pv(SV *const rv, const char *const classname,
                  void *const pv)
sv_setref_pvn

Копирует строку в новый SV, необязательно благословляя SV. Длина строки должна быть указана с помощью n. Аргумент rv будет преобразован в RV. Этот RV будет изменён, чтобы указывать на новый SV. Аргумент classname указывает пакет для благословения. Установите classname в NULL, чтобы избежать благословения. Новый SV будет иметь счётчик ссылок 1, и RV будет возвращён.

Обратите внимание, что sv_setref_pv копирует указатель, а эта функция копирует строку.

SV*  sv_setref_pvn(SV *const rv, const char *const classname,
                   const char *const pv, const STRLEN n)
sv_setref_pvs

Подобно sv_setref_pvn, но принимает литеральную строку вместо пары строка/длина.

SV *  sv_setref_pvs(SV *const rv, const char *const classname,
                    "literal string")
sv_setref_uv

Копирует беззнаковое целое число в новый SV, необязательно благословляя SV. Аргумент rv будет преобразован в RV. Этот RV будет изменён, чтобы указывать на новый SV. Аргумент classname указывает пакет для благословения. Установите classname в NULL, чтобы избежать благословения. Новый SV будет иметь счётчик ссылок 1, и RV будет возвращён.

SV*  sv_setref_uv(SV *const rv, const char *const classname,
                  const UV uv)
sv_setrv_inc
sv_setrv_inc_mg

Как sv_setrv_noinc, но увеличивает счётчик ссылок ref.

sv_setrv_inc_mg вызовет магию «set» для SV; sv_setrv_inc — нет.

void  sv_setrv_inc(SV *const sv, SV *const ref)
sv_setrv_noinc
sv_setrv_noinc_mg

Копирует указатель на SV в заданный SV как ссылку на SV, преобразуя её при необходимости. После этого SvRV(sv) будет равно ref. Это не изменяет счётчик ссылок ref. Ссылка ref не должна быть NULL.

sv_setrv_noinc_mg вызовет магию «set» для SV; sv_setrv_noinc — нет.

void  sv_setrv_noinc(SV *const sv, SV *const ref)
SvSetSV
SvSetMagicSV
SvSetSV_nosteal
SvSetMagicSV_nosteal

Если dsv совпадает с ssv, эти функции ничего не делают. В противном случае все они вызывают некоторую форму "sv_setsv". Они могут оценивать свои аргументы более одного раза.

Единственные различия:

SvSetMagicSV и SvSetMagicSV_nosteal выполняют необходимую магию «set» после этого для целевого SV; SvSetSV и SvSetSV_nosteal — нет.

SvSetSV_nosteal и SvSetMagicSV_nosteal вызывают неразрушающую версию sv_setsv.

void  SvSetSV(SV* dsv, SV* ssv)
sv_setsv
sv_setsv_flags
sv_setsv_mg
sv_setsv_nomg

Эти функции копируют содержимое исходного SV ssv в целевой SV dsv. ssv может быть уничтожен, если он смертный, поэтому не используйте эти функции, если исходный SV нужно повторно использовать. Грубо говоря, они выполняют копирование по значению, уничтожая любое предыдущее содержимое назначения.

Они различаются только тем, что:

sv_setsv вызывает магию «get» для ssv, но пропускает магию «set» для dsv.

sv_setsv_mg вызывает и магию «get» для ssv, и магию «set» для dsv.

sv_setsv_nomg пропускает всю магию.

sv_setsv_flags имеет параметр flags, который вы можете использовать для указания любого сочетания обработки магии, а также можете указать SV_NOSTEAL, чтобы буферы временных объектов не были украдены.

Вероятно, вы захотите использовать вместо этого один из набора обёртки, таких как "SvSetSV", "SvSetSV_nosteal", "SvSetMagicSV" и "SvSetMagicSV_nosteal".

sv_setsv_flags — основная функция для копирования скаляров, и большинство других функций и макросов копирования используют её внутри.

void  sv_setsv      (SV *dsv, SV *ssv)
void  sv_setsv_flags(SV *dsv, SV *ssv, const I32 flags)
void  sv_setsv_mg   (SV *const dsv, SV *const ssv)
void  sv_setsv_nomg (SV *dsv, SV *ssv)
sv_setuv
sv_setuv_mg

Эти функции копируют беззнаковое целое число в заданный SV, предварительно обновляя его при необходимости.

Они различаются только тем, что sv_setuv_mg обрабатывает магию «set»; sv_setuv — нет.

void  sv_setuv   (SV *const sv, const UV num)
void  sv_setuv_mg(SV *const sv, const UV u)
sv_set_undef

Эквивалентно sv_setsv(sv, &PL_sv_undef), но более эффективно. Не обрабатывает магию «set».

Аналогом в Perl является $sv = undef;. Обратите внимание, что она не освобождает буфер строки, в отличие от undef $sv.

Введена в perl 5.25.12.

void  sv_set_undef(SV *sv)
SvSHARE

Организует совместное использование sv между потоками, если загружен соответствующий модуль.

void  SvSHARE(SV* sv)
SvSHARED_HASH

Возвращает хэш для sv, созданный "newSVpvn_share".

struct hek*  SvSHARED_HASH(SV * sv)
SvSTASH

Возвращает стэш SV.

HV*  SvSTASH(SV* sv)
SvSTASH_set

Устанавливает значение указателя STASH в sv на val. См. "SvIV_set".

void  SvSTASH_set(SV* sv, HV* val)
sv_streq

Удобный ярлык для вызова sv_streq_flags с флагом SV_GMAGIC. Эта функция по сути ведёт себя как Perl-код $sv1 eq $sv2.

bool  sv_streq(SV* sv1, SV* sv2)
sv_streq_flags

Возвращает булево значение, указывающее, идентичны ли строки в двух SV. Если у аргумента flags установлен бит SV_GMAGIC, то он обрабатывает магию «get» тоже. Преобразует аргументы к строкам при необходимости. Обрабатывает NULL как undef. Правильно обрабатывает флаг UTF8.

Если у flags не установлен бит SV_SKIP_OVERLOAD, то будет попытка использовать перегрузку eq. Если такой перегрузки не существует или флаг установлен, будет использовано обычное сравнение строк вместо этого.

bool  sv_streq_flags(SV* sv1, SV* sv2, const U32 flags)
SvTRUE
SvTRUEx
SvTRUE_nomg
SvTRUE_NN
SvTRUE_nomg_NN

Эти функции возвращают булево значение, указывающее, будет ли Perl рассматривать SV как истинное или ложное. См. "SvOK" для проверки определённости/неопределённости.

Начиная с Perl 5.32, все они гарантируют, что sv будет вычислено только один раз. До этого релиза, только SvTRUEx гарантировала однократное вычисление; теперь SvTRUEx идентична SvTRUE.

SvTRUE_nomg и TRUE_nomg_NN не выполняют магию 'get'; остальные выполняют, если скаляр не является SvPOK, SvIOK, или SvNOK (публичные, а не приватные флаги).

SvTRUE_NN похожа на "SvTRUE", но sv предполагается не равным NULL (NN). Если есть вероятность, что это NULL, используйте обычную SvTRUE.

SvTRUE_nomg_NN похожа на "SvTRUE_nomg", но sv предполагается не равным NULL (NN). Если есть вероятность, что это NULL, используйте обычную SvTRUE_nomg.

bool  SvTRUE(SV *sv)
SvTYPE

Возвращает тип SV. См. "svtype".

svtype  SvTYPE(SV* sv)
SvUNLOCK

Освобождает взаимную блокировку на sv если соответствующий модуль был загружен.

void  SvUNLOCK(SV* sv)
sv_unmagic

Удаляет всю магию типа type из SV.

int  sv_unmagic(SV *const sv, const int type)
sv_unmagicext

Удаляет всю магию типа type со специфицированным vtbl из SV.

int  sv_unmagicext(SV *const sv, const int type, MGVTBL *vtbl)
sv_unref

Снимает статус RV у SV и уменьшает счётчик ссылок на то, на что ссылался RV. Это почти то же самое, что и обратное newSVrv. Это sv_unref_flags со значением flag равным нулю. См. "SvROK_off".

void  sv_unref(SV* sv)
sv_unref_flags

Снимает статус RV у SV и уменьшает счётчик ссылок на то, на что ссылался RV. Это почти то же самое, что и обратное newSVrv. Аргумент cflags может содержать SV_IMMEDIATE_UNREF для принудительного уменьшения счётчика ссылок (в противном случае уменьшение происходит только при условии, что счётчик ссылок отличается от одного или что SV является только для чтения). См. "SvROK_off".

void  sv_unref_flags(SV *const ref, const U32 flags)
SvUOK

Возвращает булево значение, указывающее, содержит ли SV целое число, которое должно интерпретироваться как беззнаковое. Целое число, неотрицательное и находящееся в диапазоне как IV, так и UV, может быть помечено либо как SvUOK, либо как SvIOK.

bool  SvUOK(SV* sv)
SvUPGRADE

Используется для повышения SV до более сложной формы. Использует sv_upgrade для повышения, если необходимо. См. "svtype".

void  SvUPGRADE(SV* sv, svtype type)
sv_upgrade

Повышает SV до более сложной формы. Обычно добавляет новый тип тела в SV, затем копирует как можно больше информации из старого тела. Возвращает ошибку, если SV уже имеет более сложную форму, чем требуется. Обычно желательно использовать макрос SvUPGRADE, который проверяет тип перед вызовом sv_upgrade, и поэтому не возвращает ошибку. См. также "svtype".

void  sv_upgrade(SV *const sv, svtype new_type)
sv_usepvn
sv_usepvn_mg
sv_usepvn_flags

Эти функции сообщают SV использовать ptr в качестве своего строкового значения. Обычно строки SVs хранятся внутри SV, но эти функции сообщают SV использовать внешнюю строку вместо этого.

ptr должен указывать на память, выделенную с помощью "Newx". Он должен быть началом Newx-блока памяти, а не указателем на середину блока (будьте осторожны с OOK и копированием при записи), и не должен происходить от не-Newx выделенного блока памяти, например, malloc. Длина строки, len, должна быть указана. По умолчанию эта функция будет "Renew" (т.е. перевыделять, перемещать) память, на которую указывает ptr, поэтому указатель не должен освобождаться или использоваться программистом после передачи его функции sv_usepvn, и не должны использоваться никакие указатели «за» этим указателем (например, ptr + 1).

В форме sv_usepvn_flags, если flags & SV_SMAGIC истинно, вызывается SvSETMAGIC перед возвратом. И если flags & SV_HAS_TRAILING_NUL истинно, то ptr[len] должно быть NUL, и перевыделение будет пропущено (т.е., буфер фактически на 1 байт больше, чем len, и уже соответствует требованиям для хранения в SvPVX).

sv_usepvn просто sv_usepvn_flags с flags установленным в 0, поэтому магия 'set' пропускается.

sv_usepvn_mg просто sv_usepvn_flags с flags установленным в SV_SMAGIC, поэтому выполняется магия 'set'.

void  sv_usepvn      (SV* sv, char* ptr, STRLEN len)
void  sv_usepvn_mg   (SV *sv, char *ptr, STRLEN len)
void  sv_usepvn_flags(SV *const sv, char* ptr, const STRLEN len,
                      const U32 flags)
SvUTF8

Возвращает значение U32, указывающее на состояние UTF-8 SV. При правильной настройке это указывает, содержит ли SV данные, закодированные в UTF-8. Вы должны использовать эту функцию после вызова "SvPV" или одной из её разновидностей, на случай, если какой-либо вызов перегрузки строк обновит внутренний флаг.

Если вы хотите учесть псевдоним bytes, используйте "DO_UTF8" вместо этого.

U32  SvUTF8(SV* sv)
sv_utf8_decode

Если PV SV является последовательностью октетов в расширенном UTF-8 Perl и содержит многобайтовый символ, то флаг SvUTF8 устанавливается, чтобы он выглядел как символ. Если PV содержит только символы с одним байтом, флаг SvUTF8 остаётся выключенным. Проверяет PV на корректность и возвращает FALSE, если PV — некорректный UTF-8.

bool  sv_utf8_decode(SV *const sv)
sv_utf8_downgrade
sv_utf8_downgrade_flags
sv_utf8_downgrade_nomg

Эти функции пытаются преобразовать PV SV из символов в байты. Если PV содержит символ, который не может быть представлен одним байтом, это преобразование завершится неудачей; в этом случае возвращается FALSE, если fail_ok истинно; в противном случае возвращается ошибка.

Это не универсальный интерфейс преобразования Юникод в байты: используйте расширение Encode для этой цели.

Они отличаются только тем:

sv_utf8_downgrade обрабатывает магию 'get' для sv.

sv_utf8_downgrade_nomg не обрабатывает.

sv_utf8_downgrade_flags имеет дополнительный параметр flags, в котором вы можете указать SV_GMAGIC для обработки магии 'get' или оставить его неинициализированным для пропуска магии 'get'.

bool  sv_utf8_downgrade      (SV *const sv, const bool fail_ok)
bool  sv_utf8_downgrade_flags(SV *const sv, const bool fail_ok,
                              const U32 flags)
bool  sv_utf8_downgrade_nomg (SV *const sv, const bool fail_ok)
sv_utf8_encode

Преобразует PV SV в UTF-8, но затем выключает флаг SvUTF8, чтобы он снова выглядел как октеты.

void  sv_utf8_encode(SV *const sv)
sv_utf8_upgrade
sv_utf8_upgrade_nomg
sv_utf8_upgrade_flags
sv_utf8_upgrade_flags_grow

Эти функции преобразуют PV SV в его кодировку UTF-8. SV принудительно преобразуется в строковый тип, если он им не является. Они всегда устанавливают флаг SvUTF8 для избегания проверок валидности в будущем, даже если вся строка одинакова в UTF-8 и без него. Они возвращают количество байтов в преобразованной строке.

Эти формы отличаются только двумя способами. Основное различие — обрабатывают ли они магию 'get' для sv. sv_utf8_upgrade_nomg пропускает магию 'get'; sv_utf8_upgrade обрабатывает её; а sv_utf8_upgrade_flags и sv_utf8_upgrade_flags_grow либо обрабатывают её (если бит SV_GMAGIC установлен в flags), либо нет (если этот бит сброшен).

Другое различие заключается в том, что у sv_utf8_upgrade_flags_grow есть дополнительный параметр extra, который позволяет вызывающей стороне указать количество места для резерва сверх необходимого для фактического преобразования. Это используется, когда вызывающая сторона знает, что вскоре ей потребуется ещё больше места, и более эффективно запросить место у системы в одном вызове. Эта форма в остальных случаях идентична sv_utf8_upgrade_flags.

Это не универсальный интерфейс преобразования байтовой кодировки в Юникод: используйте расширение Encode для этого.

Флаг SV_FORCE_UTF8_UPGRADE теперь игнорируется.

STRLEN  sv_utf8_upgrade           (SV *sv)
STRLEN  sv_utf8_upgrade_nomg      (SV *sv)
STRLEN  sv_utf8_upgrade_flags     (SV *const sv, const I32 flags)
STRLEN  sv_utf8_upgrade_flags_grow(SV *const sv, const I32 flags,
                                   STRLEN extra)
SvUTF8_off

Снимает статус UTF-8 у SV (данные не изменяются, только флаг). Не используйте без необходимости.

void  SvUTF8_off(SV *sv)
SvUTF8_on

Устанавливает статус UTF-8 у SV (данные не изменяются, только флаг). Не используйте без необходимости.

void  SvUTF8_on(SV *sv)
SvUV
SvUVx
SvUV_nomg

Эти функции приводят данный SV к типу UV и возвращают его. Возвращаемое значение во многих случаях будет сохранено в слоте UV sv, но не во всех. (Используйте "sv_setuv" чтобы убедиться, что так и есть).

SvUVx отличается от других тем, что гарантирует вычисление sv ровно один раз; другие могут вычислить его несколько раз. Используйте эту форму только если sv — выражение с побочными эффектами, в противном случае используйте более эффективную SvUV.

SvUV_nomg то же, что и SvUV, но не выполняет магию 'get'.

UV  SvUV(SV* sv)
SvUV_set

Устанавливает значение указателя UV в sv на val. См. "SvIV_set".

void  SvUV_set(SV* sv, UV val)
SvUVX

Возвращает исходное значение в слоте UV SV без проверок или преобразований. Используйте только когда уверены, что SvIOK истинно. См. также "SvUV".

UV  SvUVX(SV* sv)
SvUVXx

DEPRECATED! Планируется удалить SvUVXx в будущих версиях Perl. Не используйте в новом коде; удалите из существующего.

Это ненужный синоним для "SvUVX"

UV  SvUVXx(SV* sv)
END_OF_DOCUMENT_MARKER
sv_vcatpvf
sv_vcatpvf_mg

Эти функции обрабатывают свои аргументы как sv_vcatpvfn , вызываемые с непустым списком аргументов C-стиля, и добавляют отформатированный вывод к sv.

Они различаются только тем, что sv_vcatpvf_mg выполняет магию «set»; sv_vcatpvf пропускает магию «set».

Обе выполняют магию «get».

Обычно к ним обращаются через свои фронтенды "sv_catpvf" и "sv_catpvf_mg".

void  sv_vcatpvf(SV *const sv, const char *const pat,
                 va_list *const args)
sv_vcatpvfn
sv_vcatpvfn_flags

Эти функции обрабатывают свои аргументы как vsprintf(3) и добавляют отформатированный вывод к SV. Они используют массив SV, если список аргументов C-стиля отсутствует (NULL). Переупорядочение аргументов (используя спецификаторы формата, такие как %2$d или %*2$d) поддерживается только при использовании массива SV; использование списка аргументов C-стиля с форматирующей строкой, использующей переупорядочение аргументов, вызовет исключение.

При включённой проверке загрязнения они указывают с помощью maybe_tainted , являются ли результаты недостоверными (часто из-за использования локали).

Они предполагают, что pat имеет тот же тип utf8, что и sv . Ответственность за это лежит на вызывающей стороне.

Они отличаются тем, что sv_vcatpvfn_flags имеет параметр flags, в котором вы можете установить или сбросить флаги SV_GMAGIC и/или SV_SMAGIC, чтобы указать, какую магию обрабатывать, а какую нет; в то время как обычная функция sv_vcatpvfn всегда указывает на магию «get» и «set».

Обычно они используются через один из фронтендов "sv_vcatpvf" и "sv_vcatpvf_mg".

void  sv_vcatpvfn      (SV *const sv, const char *const pat,
                        const STRLEN patlen, va_list *const args,
                        SV **const svargs, const Size_t sv_count,
                        bool *const maybe_tainted)
void  sv_vcatpvfn_flags(SV *const sv, const char *const pat,
                        const STRLEN patlen, va_list *const args,
                        SV **const svargs, const Size_t sv_count,
                        bool *const maybe_tainted,
                        const U32 flags)
SvVOK

Возвращает логическое значение, указывающее, содержит ли SV v-строку.

bool  SvVOK(SV* sv)
sv_vsetpvf
sv_vsetpvf_mg

Эти функции работают как "sv_vcatpvf" , но копируют текст в SV вместо добавления.

Они различаются только тем, что sv_vsetpvf_mg выполняет магию «set»; sv_vsetpvf пропускает всю магию.

Обычно они используются через свои фронтенды "sv_setpvf" и "sv_setpvf_mg".

void  sv_vsetpvf(SV *const sv, const char *const pat,
                 va_list *const args)
sv_vsetpvfn

Работает как sv_vcatpvfn , но копирует текст в SV вместо добавления.

Обычно используется через один из своих фронтендов "sv_vsetpvf" и "sv_vsetpvf_mg".

void  sv_vsetpvfn(SV *const sv, const char *const pat,
                  const STRLEN patlen, va_list *const args,
                  SV **const svargs, const Size_t sv_count,
                  bool *const maybe_tainted)
SvVSTRING_mg

Возвращает магию vstring или NULL, если её нет.

MAGIC*  SvVSTRING_mg(SV * sv)
vnewSVpvf

Подобно "newSVpvf" , но аргументы представляют собой упакованный список аргументов.

SV*  vnewSVpvf(const char *const pat, va_list *const args)

Загрязнение

SvTAINT

Загрязнён SV, если включено загрязнение и некоторые входные данные в текущее выражение загрязнены — обычно переменная, но, возможно, и неявные входные данные, такие как настройки локали. SvTAINT распространяет это загрязнение на выходные данные выражения пессимистичным образом; то есть, не обращая внимания на то, какие именно выходные данные влияют на какие входные данные.

void  SvTAINT(SV* sv)
SvTAINTED

Проверяет, загрязнён ли SV. Возвращает TRUE, если загрязнён, и FALSE, если нет.

bool  SvTAINTED(SV* sv)
SvTAINTED_off

Сбрасывает загрязнение SV. Будьте очень осторожны с этой функцией, так как она обрывает некоторые основные функции безопасности Perl. Авторы модулей XS не должны использовать эту функцию, если они полностью не понимают все последствия безусловного сброса загрязнения значения. Сброс загрязнения следует выполнять стандартным способом Perl — с помощью тщательно продуманного регулярного выражения, а не непосредственным сбросом загрязнения переменных.

void  SvTAINTED_off(SV* sv)
SvTAINTED_on

Отмечает SV как загрязнённое, если включено загрязнение.

void  SvTAINTED_on(SV* sv)

Время

ASCTIME_R_PROTO

Этот символ кодирует прототип asctime_r. Он равен нулю, если d_asctime_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_asctime_r определено.

CTIME_R_PROTO

Этот символ кодирует прототип ctime_r. Он равен нулю, если d_ctime_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_ctime_r определено.

GMTIME_MAX

Этот символ содержит максимальное значение для смещения time_t , которое функция gmtime() системы принимает, по умолчанию равно 0

GMTIME_MIN

Этот символ содержит минимальное значение для смещения time_t , которое функция gmtime() системы принимает, по умолчанию равно 0

GMTIME_R_PROTO

Этот символ кодирует прототип gmtime_r. Он равен нулю, если d_gmtime_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из reentr.h, если d_gmtime_r определено.

HAS_ASCTIME64

Если этот символ определён, это указывает, что функция asctime64 () доступна для выполнения 64-битной версии asctime ()

HAS_ASCTIME_R

Если этот символ определён, это указывает, что функция asctime_r доступна для выполнения asctime рекурсивно.

HAS_CTIME64

Если этот символ определён, это указывает, что функция ctime64 () доступна для выполнения 64-битной версии ctime ()

HAS_CTIME_R

Если этот символ определён, это указывает, что функция ctime_r доступна для выполнения ctime рекурсивно.

HAS_DIFFTIME

Если этот символ определён, это указывает, что функция difftime доступна.

HAS_DIFFTIME64

Если этот символ определён, это указывает, что функция difftime64 () доступна для выполнения 64-битной версии difftime ()

HAS_FUTIMES

Если этот символ определён, это указывает, что функция futimes доступна для изменения временных меток дескрипторов файлов с помощью struct timevals.

HAS_GETITIMER

Если этот символ определён, это указывает, что функция getitimer доступна для возвращения таймеров интервалов.

HAS_GETTIMEOFDAY

Если этот символ определён, это указывает, что системный вызов gettimeofday() доступен для часов с точностью до долей секунды. Обычно необходимо включить файл sys/resource.h (см. "I_SYS_RESOURCE"). Тип «Timeval» следует использовать для обозначения «struct timeval».

HAS_GMTIME64

Если этот символ определён, это указывает, что функция gmtime64 () доступна для выполнения 64-битной версии gmtime ()

HAS_GMTIME_R

Если этот символ определён, это указывает, что функция gmtime_r доступна для рекурсивного выполнения gmtime.

HAS_LOCALTIME64

Если этот символ определён, это указывает, что функция localtime64 () доступна для выполнения 64-битной версии localtime ()

HAS_LOCALTIME_R

Если этот символ определён, это указывает, что функция localtime_r доступна для рекурсивного выполнения localtime.

HAS_MKTIME

Если этот символ определён, это указывает, что функция mktime доступна.

HAS_MKTIME64

Если этот символ определён, это указывает, что функция mktime64 () доступна для выполнения 64-битной версии mktime ()

HAS_NANOSLEEP

Если этот символ определён, это указывает, что системный вызов nanosleep доступен для сна с точностью 1E-9 сек.

HAS_SETITIMER

Если этот символ определён, это указывает, что функция setitimer доступна для установки таймеров интервалов.

HAS_STRFTIME

Если этот символ определён, это указывает, что функция strftime доступна для форматирования времени.

HAS_TIME

Если этот символ определён, это указывает, что функция time() существует.

HAS_TIMEGM

Если этот символ определён, это указывает, что функция timegm доступна для выполнения противоположной операции gmtime ()

HAS_TIMES

Если этот символ определён, это указывает, что функция times() существует. Обратите внимание, что на некоторых системах это стало устаревшим (SUNOS), которые теперь используют getrusage(). Возможно, потребуется включить sys/times.h.

HAS_TM_TM_GMTOFF

Если этот символ определён, это указывает C-программе, что у struct tm есть поле tm_gmtoff.

HAS_TM_TM_ZONE

Если этот символ определён, это указывает C-программе, что у struct tm есть поле tm_zone.

HAS_TZNAME

Если этот символ определён, это указывает, что массив tzname[] доступен для доступа к именам часовых поясов.

HAS_USLEEP

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

HAS_USLEEP_PROTO

Если этот символ определён, это указывает, что система предоставляет прототип для функции usleep(). В противном случае программист должен предоставить его. Хорошим предположением является

extern int usleep(useconds_t);
I_TIME

Этот символ всегда определён и указывает C-программе, что она должна включить time.h.

#ifdef I_TIME
    #include <time.h>
#endif
I_UTIME

Если этот символ определён, это указывает C-программе, что она должна включить utime.h.

#ifdef I_UTIME
    #include <utime.h>
#endif
LOCALTIME_MAX

Этот символ содержит максимальное значение для смещения time_t , которое функция localtime () системы принимает, по умолчанию равно 0

LOCALTIME_MIN

Этот символ содержит минимальное значение для смещения time_t, которое принимает системная функция localtime(), и по умолчанию равен 0.

LOCALTIME_R_NEEDS_TZSET

Многие реализации libc не вызывают tzset, что делает их отличными от localtime(), и делает изменения часового пояса с помощью $ENV{TZ} без явного вызова tzset невозможными. Этот символ заставляет нас вызывать tzset перед localtime_r

LOCALTIME_R_PROTO

Этот символ кодирует прототип localtime_r. Он равен нулю, если d_localtime_r не определено, и одному из макросов REENTRANT_PROTO_T_ABC из файла reentr.h, если d_localtime_r определено.

L_R_TZSET

Если localtime_r() нуждается в tzset, оно определено в этом определении.

mini_mktime

Нормализует значения struct tm без семантики localtime() (и накладных расходов) функции mktime().

void  mini_mktime(struct tm *ptm)
my_strftime

strftime(), но с другим API, так что возвращаемое значение — указатель на отформатированный результат (который ДОЛЖЕН быть освобождён вызывающей стороной). Это позволяет этой функции увеличивать размер буфера по мере необходимости, чтобы вызывающей стороне не нужно было беспокоиться об этом.

Обратите внимание, что yday и wday фактически игнорируются этой функцией, так как mini_mktime() перезаписывает их.

Также обратите внимание, что эта функция всегда выполняется в базовом языковом стандарте программы, что даёт локализованные результаты.

ПРИМЕЧАНИЕ: my_strftime необходимо явным образом вызывать как Perl_my_strftime с параметром aTHX_.

char *  Perl_my_strftime(pTHX_ const char *fmt, int sec, int min,
                         int hour, int mday, int mon, int year,
                         int wday, int yday, int isdst)

Имена typedef

DB_Hash_t

Этот символ содержит тип элемента структуры префикса в заголовочном файле db.h. В более старых версиях DB это был int, а в более новых — size_t.

DB_Prefix_t

Этот символ содержит тип элемента структуры префикса в заголовочном файле db.h. В более старых версиях DB это был int, а в более новых — u_int32_t.

Direntry_t

Этот символ устанавливается в 'struct direct' или 'struct dirent' в зависимости от того, доступен ли dirent или нет. Вы должны использовать этот псевдотип для портативного объявления записей каталога.

Fpos_t

Этот символ содержит тип, используемый для объявления позиций файлов в libc. Это может быть fpos_t, long, uint и т. д... Возможно, потребуется включить sys/types.h для получения любой информации typedef.

Free_t

Эта переменная содержит возвращаемый тип free(). Обычно это void, но иногда int.

Gid_t

Этот символ содержит возвращаемый тип getgid() и тип аргумента setrgid() и связанных функций. Обычно это тип идентификаторов групп в ядре. Это может быть int, ushort, gid_t, и т. д... Возможно, потребуется включить sys/types.h для получения любой информации typedef.

Gid_t_f

Этот символ определяет строку формата, используемую для вывода Gid_t.

Gid_t_sign

Этот символ содержит знак Gid_t. 1 для беззнакового, -1 для знакового.

Gid_t_size

Этот символ содержит размер Gid_t в байтах.

Groups_t

Этот символ содержит тип, используемый для второго аргумента getgroups() и setgroups(). Обычно он такой же, как gidtype (gid_t), но иногда нет. Это может быть int, ushort, gid_t, и т. д... Возможно, потребуется включить sys/types.h для получения любой информации typedef. Это необходимо только если у вас есть getgroups() или setgroups().

Malloc_t

Этот символ — тип указателя, возвращаемого функциями malloc и realloc.

Mmap_t

Этот символ содержит возвращаемый тип системного вызова mmap() (и одновременно тип первого аргумента). Обычно устанавливается в 'void *' или 'caddr_t'.

Mode_t

Этот символ содержит тип, используемый для объявления режимов файлов для системных вызовов. Обычно это mode_t, но может быть int или unsigned short. Возможно, потребуется включить sys/types.h для получения любой информации typedef.

Netdb_hlen_t

Этот символ содержит тип, используемый для второго аргумента gethostbyaddr().

Netdb_host_t

Этот символ содержит тип, используемый для первого аргумента gethostbyaddr().

Netdb_name_t

Этот символ содержит тип, используемый для аргумента gethostbyname().

Netdb_net_t

Этот символ содержит тип, используемый для первого аргумента getnetbyaddr().

Off_t

Этот символ содержит тип, используемый для объявления смещений в ядре. Это может быть int, long, off_t, и т. д... Возможно, потребуется включить sys/types.h для получения любой информации typedef.

Off_t_size

Этот символ содержит количество байтов, используемых Off_t.

Pid_t

Этот символ содержит тип, используемый для объявления идентификаторов процессов в ядре. Это может быть int, uint, pid_t, и т. д... Возможно, потребуется включить sys/types.h для получения любой информации typedef.

Rand_seed_t

Этот символ определяет тип аргумента функции инициализации генератора случайных чисел.

Select_fd_set_t

Этот символ содержит тип, используемый для второго, третьего и четвёртого аргументов select. Обычно это 'fd_set *', если HAS_FD_SET определено, и 'int *' в противном случае. Это полезно только если у вас есть select().

Shmat_t

Этот символ содержит возвращаемый тип системного вызова shmat(). Обычно устанавливается в 'void *' или 'char *'.

Signal_t

Значение этого символа — либо "void", либо "int", соответствующие соответствующему возвращаемому типу обработчика сигнала. Таким образом, вы можете объявить обработчик сигнала, используя "Signal_t (*handler)()", и определить обработчик, используя "Signal_t handler(sig)".

Size_t

Этот символ содержит тип, используемый для объявления параметров длины для функций строк. Обычно это size_t, но может быть unsigned long, int и т. д. Возможно, потребуется включить sys/types.h для получения любой информации typedef.

Size_t_size

Этот символ содержит размер Size_t в байтах.

Sock_size_t

Этот символ содержит тип, используемый для аргумента размера различных системных вызовов сокетов (только базовый тип, а не указатель).

SSize_t

Этот символ содержит тип, используемый функциями, возвращающими количество байтов или код ошибки. Это должен быть знаковый тип. Обычно это ssize_t, но может быть long или int и т. д. Возможно, потребуется включить sys/types.h или unistd.h для получения любой информации typedef. Мы выберем тип такой, что sizeof(SSize_t) == sizeof(Size_t).

Time_t

Этот символ содержит тип, возвращаемый time(). Это может быть long или time_t на сайтах BSD (в этом случае необходимо включить sys/types.h).

Uid_t

Этот символ содержит тип, используемый для объявления идентификаторов пользователей в ядре. Это может быть int, ushort, uid_t, и т. д... Возможно, потребуется включить sys/types.h для получения любой информации typedef.

Uid_t_f

Этот символ определяет строку формата, используемую для вывода Uid_t.

Uid_t_sign

Этот символ содержит знак Uid_t. 1 для беззнакового, -1 для знакового.

Uid_t_size

Этот символ содержит размер Uid_t в байтах.

Поддержка Юникода

"Поддержка Юникода" в perlguts содержит введение в этот API.

См. также "Character classification", "Character case changing", и "String Handling". Различные функции за пределами этого раздела также работают специально с Юникодом. Поиск строки "utf8" в этом документе.

BOM_UTF8

Это макрос, который вычисляет строковую константу байтов UTF-8, определяющих метку порядка байтов Юникода (U+FEFF) для платформы, на которой скомпилирован Perl. Это позволяет коду использовать мнемонику для этого символа, которая работает как на платформах ASCII, так и EBCDIC. sizeof(BOM_UTF8) - 1 можно использовать для получения его длины в байтах.

bytes_cmp_utf8

Сравнивает последовательность символов (хранящихся как октеты) в b, blen с последовательностью символов (хранящихся как UTF-8) в u, ulen. Возвращает 0, если они равны, -1 или -2, если первая строка меньше второй, +1 или +2, если первая строка больше второй.

-1 или +1 возвращается, если более короткая строка была идентична началу более длинной строки. -2 или +2 возвращается, если были различия между символами в строках.

int  bytes_cmp_utf8(const U8 *b, STRLEN blen, const U8 *u,
                    STRLEN ulen)
bytes_from_utf8

ПРИМЕЧАНИЕ: bytes_from_utf8 является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Преобразует потенциально закодированную в UTF-8 строку s длиной *lenp в кодировку байтов по умолчанию. В качестве входного параметра, булево значение *is_utf8p указывает, закодирована ли строка s в UTF-8.

В отличие от "utf8_to_bytes", но подобно "bytes_to_utf8", эта функция не изменяет входную строку.

Не выполняет никаких действий, если *is_utf8p равно 0 или если в строке есть символы, не представимые в кодировке байтов по умолчанию. В этих случаях значения *is_utf8p и *lenp остаются без изменений, а возвращаемое значение — исходное значение s.

В противном случае *is_utf8p устанавливается в 0, а возвращаемое значение — указатель на новую строку, содержащую скопированные байты из s, длина которой возвращается в *lenp, обновлённом значении. Новая строка завершается символом NUL. Вызывающий код несёт ответственность за освобождение памяти, используемой этой строкой.

После успешного возврата количество вариантов в строке можно рассчитать, сохранив значение *lenp до вызова и вычитав из него значение *lenp после вызова.

U8*  bytes_from_utf8(const U8 *s, STRLEN *lenp, bool *is_utf8p)
bytes_to_utf8

ПРИМЕЧАНИЕ: bytes_to_utf8 является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Преобразует строку s длиной *lenp байт из кодировки по умолчанию в UTF-8. Возвращает указатель на созданную строку и устанавливает *lenp для отражения новой длины в байтах. Вызывающий код несёт ответственность за освобождение памяти, используемой этой строкой.

После успешного возврата количество вариантов в строке можно рассчитать, сохранив значение *lenp до вызова и вычитав его из значения *lenp после вызова.

Символ NUL будет добавлен после конца строки.

Если необходимо преобразовать в UTF-8 из кодировок, отличных от кодировки по умолчанию (Latin1 или EBCDIC), см. "sv_recode_to_utf8"().

U8*  bytes_to_utf8(const U8 *s, STRLEN *lenp)
DO_UTF8

Возвращает булево значение, указывающее, обрабатывать ли PV в sv как закодированное в UTF-8.

Используйте эту функцию после вызова SvPV() или одной из её разновидностей, на случай, если любой вызов перегрузки строк обновит внутренний флаг кодировки UTF-8.

bool  DO_UTF8(SV* sv)
foldEQ_utf8

Возвращает true, если начальные части строк s1 и s2 (любая или обе из которых могут быть в UTF-8) одинаковы без учёта регистра; в противном случае возвращает false. Расстояние, на которое сравниваются строки, определяется другими входными параметрами.

Если u1 равно true, строка s1 предполагается закодированной в Unicode UTF-8; в противном случае она предполагается в кодировке байтов по умолчанию. Соответственно для u2 относительно s2.

Если длина в байтах l1 отлична от нуля, она определяет расстояние, на которое необходимо проверить равенство строк в s1. Другими словами, s1 + l1 будет использовано как целевая точка. Сравнение не считается совпадением, пока цель не будет достигнута, и сканирование не будет продолжено за этой точкой. Соответственно для l2 относительно s2.

Если pe1 отлично от NULL и указатель, на который он указывает, не NULL, этот указатель рассматривается как конечная точка, 1 байт за максимальной точкой в s1, за которой сканирование не будет продолжено ни при каких обстоятельствах. (Эта функция предполагает, что входные строки, закодированные в UTF-8, не имеют ошибок; ошибки во входных данных могут привести к чтению за pe1). Это означает, что если оба l1 и pe1 указаны, и pe1 меньше s1 + l1, совпадение никогда не будет успешным, так как оно никогда не достигнет цели (и, в самом деле, этому противостоит). Соответственно для pe2 относительно s2.

По крайней мере, один из s1 и s2 должен иметь цель (по крайней мере, один из l1 и l2 должен быть отличным от нуля), и если оба имеют, оба должны быть достигнуты для успешного совпадения. Кроме того, если складка символа состоит из нескольких символов, все они должны быть сопоставлены (см. ссылку tr21 ниже для «складывания»).

При успешном совпадении, если pe1 не равно NULL, оно будет указывать на начало следующего символа s1 за тем, что было сопоставлено. Соответственно для pe2 и s2.

Для обеспечения регистронезависимости используется «складывание» Unicode, а не приведение символов к верхнему или нижнему регистру. См. https://www.unicode.org/reports/tr21/ (Преобразования в нижний и верхний регистр).

I32  foldEQ_utf8(const char *s1, char **pe1, UV l1, bool u1,
                 const char *s2, char **pe2, UV l2, bool u2)
is_ascii_string

Это немного вводящее в заблуждение синоним для "is_utf8_invariant_string". На платформах с ASCII-подобной кодировкой название не вводит в заблуждение: символы ASCII-диапазона точно соответствуют UTF-8 инвариантам. Но на машинах EBCDIC инвариантов больше, чем просто символов ASCII, поэтому is_utf8_invariant_string предпочтительнее.

bool  is_ascii_string(const U8* const s, STRLEN len)
is_c9strict_utf8_string

Возвращает TRUE, если первые len байта строки s образуют корректную строку UTF-8, соответствующую Unicode Corrigendum #9; в противном случае возвращает FALSE. Если len равно 0, оно будет вычислено с помощью strlen(s) (что означает, что если вы используете этот вариант, s не может содержать вложенных NUL символов и должно иметь завершающий NUL байт). Обратите внимание, что все символы ASCII составляют 'корректную строку UTF-8'.

Эта функция возвращает FALSE для строк, содержащих любые кодовые точки выше максимального значения Unicode 0x10FFFF или суррогатные кодовые точки, но принимает несимвольные кодовые точки в соответствии с Corrigendum #9.

См. также "is_utf8_invariant_string", "is_utf8_invariant_string_loc", "is_utf8_string", "is_utf8_string_flags", "is_utf8_string_loc", "is_utf8_string_loc_flags", "is_utf8_string_loclen", "is_utf8_string_loclen_flags", "is_utf8_fixed_width_buf_flags", "is_utf8_fixed_width_buf_loc_flags", "is_utf8_fixed_width_buf_loclen_flags", "is_strict_utf8_string", "is_strict_utf8_string_loc", "is_strict_utf8_string_loclen", "is_c9strict_utf8_string_loc", и "is_c9strict_utf8_string_loclen".

bool  is_c9strict_utf8_string(const U8 *s, STRLEN len)
is_c9strict_utf8_string_loc

Аналогично "is_c9strict_utf8_string", но сохраняет местоположение ошибки (в случае «ошибки utf8») или местоположение s+len (в случае «успеха utf8») в указателе ep.

См. также "is_c9strict_utf8_string_loclen".

bool  is_c9strict_utf8_string_loc(const U8 *s, STRLEN len,
                                  const U8 **ep)
is_c9strict_utf8_string_loclen

Аналогично "is_c9strict_utf8_string", но сохраняет местоположение ошибки (в случае «ошибки utf8») или местоположение s+len (в случае «успеха utf8») в указателе ep, и количество закодированных в UTF-8 символов в указателе el.

См. также "is_c9strict_utf8_string_loc".

bool  is_c9strict_utf8_string_loclen(const U8 *s, STRLEN len,
                                     const U8 **ep, STRLEN *el)
isC9_STRICT_UTF8_CHAR

Принимает ненулевое значение, если первые несколько байтов строки, начиная с s и не просматривая дальше e - 1, являются корректным UTF-8, представляющим некоторую несуррогатную кодовую точку Unicode; в противном случае принимает значение 0. Если ненулевое, значение показывает, сколько байтов, начиная с s, составляют представление кодовой точки. Любые оставшиеся байты перед e, но за теми, которые необходимы для формирования первой кодовой точки в s, не рассматриваются.

Наибольшая допустимая кодовая точка — максимальное значение Unicode 0x10FFFF. Это отличается от "isSTRICT_UTF8_CHAR" только тем, что оно принимает несимвольные кодовые точки. Это соответствует Unicode Corrigendum #9, который указал, что несимвольные кодовые точки просто не рекомендуются, а не полностью запрещены при открытом обмене. См. "Несимвольные кодовые точки" в perlunicode.

Используйте "isUTF8_CHAR" для проверки расширенного UTF-8 Perl; и "isUTF8_CHAR_flags" для более настраиваемого определения.

Используйте "is_c9strict_utf8_string", "is_c9strict_utf8_string_loc", и "is_c9strict_utf8_string_loclen" для проверки целых строк.

Size_t  isC9_STRICT_UTF8_CHAR(const U8 * const s0,
                              const U8 * const e)
is_invariant_string

Это несколько вводящее в заблуждение синоним для "is_utf8_invariant_string". is_utf8_invariant_string предпочтительнее, так как оно указывает при каких условиях строка является инвариантной.

bool  is_invariant_string(const U8* const s, STRLEN len)
isSTRICT_UTF8_CHAR

Принимает ненулевое значение, если первые несколько байтов строки, начиная с s и не просматривая дальше e - 1, являются корректным UTF-8, представляющим некоторую полностью допустимую кодовую точку Unicode для открытого обмена между всеми приложениями; в противном случае принимает значение 0. Если ненулевое, значение показывает, сколько байтов, начиная с s, составляют представление кодовой точки. Любые оставшиеся байты перед e, но за теми, которые необходимы для формирования первой кодовой точки в s, не рассматриваются.

Наибольшая допустимая кодовая точка — максимальное значение Unicode 0x10FFFF, и она не должна быть суррогатной или несимвольной кодовой точкой. Таким образом, это исключает любые кодовые точки из расширенного UTF-8 Perl.

Это используется для эффективного определения, являются ли следующие несколько байтов в s законным, допустимым UTF-8 Unicode для одного символа.

Используйте "isC9_STRICT_UTF8_CHAR" для использования определения допустимых кодовых точек в соответствии с Unicode Corrigendum #9; "isUTF8_CHAR" для проверки расширенного UTF-8 Perl; и "isUTF8_CHAR_flags" для более настраиваемого определения.

Используйте "is_strict_utf8_string", "is_strict_utf8_string_loc", и "is_strict_utf8_string_loclen" для проверки целых строк.

Size_t  isSTRICT_UTF8_CHAR(const U8 * const s0,
                           const U8 * const e)
is_strict_utf8_string

Возвращает TRUE, если первые len байта строки s образуют корректную строку UTF-8, полностью совместимую с правилами Unicode; в противном случае возвращает FALSE. Если len равно 0, оно будет вычислено с помощью strlen(s) (что означает, что если вы используете этот вариант, то s не может содержать вложенных символов NUL и должна иметь завершающий байт NUL). Обратите внимание, что все символы ASCII составляют 'корректную строку UTF-8'.

Эта функция возвращает FALSE для строк, содержащих любые коды, превышающие максимальное значение Unicode 0x10FFFF, суррогатные коды или несимвольные коды.

См. также "is_utf8_invariant_string", "is_utf8_invariant_string_loc", "is_utf8_string", "is_utf8_string_flags", "is_utf8_string_loc", "is_utf8_string_loc_flags", "is_utf8_string_loclen", "is_utf8_string_loclen_flags", "is_utf8_fixed_width_buf_flags", "is_utf8_fixed_width_buf_loc_flags", "is_utf8_fixed_width_buf_loclen_flags", "is_strict_utf8_string_loc", "is_strict_utf8_string_loclen", "is_c9strict_utf8_string", "is_c9strict_utf8_string_loc", и "is_c9strict_utf8_string_loclen".

bool  is_strict_utf8_string(const U8 *s, STRLEN len)
is_strict_utf8_string_loc

Аналогично "is_strict_utf8_string", но сохраняет местоположение ошибки (в случае "ошибки utf8") или местоположение s+len (в случае "успеха utf8") в указателе ep.

См. также "is_strict_utf8_string_loclen".

bool  is_strict_utf8_string_loc(const U8 *s, STRLEN len,
                                const U8 **ep)
is_strict_utf8_string_loclen

Аналогично "is_strict_utf8_string", но сохраняет местоположение ошибки (в случае "ошибки utf8") или местоположение s+len (в случае "успеха utf8") в указателе ep, и количество кодированных символов UTF-8 в указателе el.

См. также "is_strict_utf8_string_loc".

bool  is_strict_utf8_string_loclen(const U8 *s, STRLEN len,
                                   const U8 **ep, STRLEN *el)
is_utf8_char

DEPRECATED! Планируется удалить is_utf8_char из будущих релизов Perl. Не используйте его в новом коде; удалите его из существующего кода.

Проверяет, начинается ли некоторое произвольное количество байтов с корректного символа UTF-8. Обратите внимание, что инвариантный (т.е. ASCII на машинах, не использующих EBCDIC) символ является корректным символом UTF-8. Фактическое количество байтов в символе UTF-8 будет возвращено, если он корректный, иначе 0.

Эта функция устарела из-за возможности, что некорректный ввод может привести к чтению за пределы буфера ввода. Используйте вместо этого "isUTF8_CHAR".

STRLEN  is_utf8_char(const U8 *s)
is_utf8_char_buf

Это идентично макросу "isUTF8_CHAR" в perlapi.

STRLEN  is_utf8_char_buf(const U8 *buf, const U8 *buf_end)
is_utf8_fixed_width_buf_flags

Возвращает TRUE, если фиксированный буфер, начинающийся с s и длиной len, полностью корректен в UTF-8, с учетом ограничений, заданных flags; в противном случае возвращает FALSE.

Если flags равно 0, любой корректный UTF-8, расширенный Perl, принимается без ограничений. Если последние несколько байтов буфера не образуют полный символ, это все равно вернет TRUE, при условии, что "is_utf8_valid_partial_char_flags" вернет TRUE для них.

Если flags не равно нулю, оно может быть любой комбинацией флагов UTF8_DISALLOW_foo, принятых "utf8n_to_uvchr", и с теми же значениями.

Эта функция отличается от "is_utf8_string_flags" только тем, что последняя возвращает FALSE, если последние несколько байтов строки не образуют полный символ.

bool  is_utf8_fixed_width_buf_flags(const U8 * const s,
                                    STRLEN len, const U32 flags)
is_utf8_fixed_width_buf_loclen_flags

Аналогично "is_utf8_fixed_width_buf_loc_flags", но сохраняет количество полных, корректных символов в указателе el.

bool  is_utf8_fixed_width_buf_loclen_flags(const U8 * const s,
                                           STRLEN len,
                                           const U8 **ep,
                                           STRLEN *el,
                                           const U32 flags)
is_utf8_fixed_width_buf_loc_flags

Аналогично "is_utf8_fixed_width_buf_flags", но сохраняет местоположение ошибки в указателе ep. Если функция возвращает TRUE, *ep будет указывать на начало любого частичного символа в конце буфера; если частичного символа нет, *ep будет содержать s+len.

См. также "is_utf8_fixed_width_buf_loclen_flags".

bool  is_utf8_fixed_width_buf_loc_flags(const U8 * const s,
                                        STRLEN len, const U8 **ep,
                                        const U32 flags)
is_utf8_invariant_string

Возвращает TRUE, если первые len байта строки s одинаковы независимо от кодировки UTF-8 строки (или кодировки UTF-EBCDIC на машинах EBCDIC); в противном случае возвращает FALSE. То есть, она возвращает TRUE, если они инвариантны для UTF-8. На машинах с ASCII-подобной кодировкой все символы ASCII и только они соответствуют этому определению. На машинах EBCDIC символы диапазона ASCII также инвариантны, а также управляющие символы C1.

Если len равно 0, оно будет вычислено с помощью strlen(s), (что означает, что если вы используете этот вариант, то s не может содержать вложенных NUL символов и должна иметь завершающий NUL байт).

См. также "is_utf8_string", "is_utf8_string_flags", "is_utf8_string_loc", "is_utf8_string_loc_flags", "is_utf8_string_loclen", "is_utf8_string_loclen_flags", "is_utf8_fixed_width_buf_flags", "is_utf8_fixed_width_buf_loc_flags", "is_utf8_fixed_width_buf_loclen_flags", "is_strict_utf8_string", "is_strict_utf8_string_loc", "is_strict_utf8_string_loclen", "is_c9strict_utf8_string", "is_c9strict_utf8_string_loc", и "is_c9strict_utf8_string_loclen".

bool  is_utf8_invariant_string(const U8* const s, STRLEN len)
is_utf8_invariant_string_loc

Аналогично "is_utf8_invariant_string", но при ошибке сохраняет местоположение первого символа, неинвариантного к UTF-8, в указателе ep; если все символы инвариантны для UTF-8, эта функция не изменяет содержимое *ep.

bool  is_utf8_invariant_string_loc(const U8* const s, STRLEN len,
                                   const U8 ** ep)
is_utf8_string

Возвращает TRUE, если первые len байта строки s образуют корректную строку Perl-расширенного UTF-8; в противном случае возвращает FALSE. Если len равно 0, оно будет вычислено с помощью strlen(s) (что означает, что если вы используете этот вариант, то s не может содержать вложенных NUL символов и должна иметь завершающий NUL байт). Обратите внимание, что все символы ASCII составляют 'корректную строку UTF-8'.

Эта функция считает расширенный UTF-8 Perl корректным. Это означает, что коды, превышающие Unicode, суррогатные и несимвольные коды, считаются корректными этой функцией. Используйте "is_strict_utf8_string", "is_c9strict_utf8_string", или "is_utf8_string_flags", чтобы ограничить, какие коды считаются корректными.

См. также "is_utf8_invariant_string", "is_utf8_invariant_string_loc", "is_utf8_string_loc", "is_utf8_string_loclen", "is_utf8_fixed_width_buf_flags", "is_utf8_fixed_width_buf_loc_flags", "is_utf8_fixed_width_buf_loclen_flags",

bool  is_utf8_string(const U8 *s, STRLEN len)
is_utf8_string_flags

Возвращает TRUE, если первые len байта строки s образуют корректную строку UTF-8 с учетом ограничений, наложенных flags; в противном случае возвращает FALSE. Если len равно 0, оно будет вычислено с помощью strlen(s) (что означает, что если вы используете этот вариант, то s не может содержать вложенных NUL символов и должна иметь завершающий NUL байт). Обратите внимание, что все символы ASCII составляют 'корректную строку UTF-8'.

Если flags равно 0, это даёт те же результаты, что и "is_utf8_string"; если flags равно UTF8_DISALLOW_ILLEGAL_INTERCHANGE, это даёт те же результаты, что и "is_strict_utf8_string"; и если flags равно UTF8_DISALLOW_ILLEGAL_C9_INTERCHANGE, это даёт те же результаты, что и "is_c9strict_utf8_string". В противном случае flags может быть любой комбинацией флагов UTF8_DISALLOW_foo, понимаемых "utf8n_to_uvchr", с теми же значениями.

См. также "is_utf8_invariant_string", "is_utf8_invariant_string_loc", "is_utf8_string", "is_utf8_string_loc", "is_utf8_string_loc_flags", "is_utf8_string_loclen", "is_utf8_string_loclen_flags", "is_utf8_fixed_width_buf_flags", "is_utf8_fixed_width_buf_loc_flags", "is_utf8_fixed_width_buf_loclen_flags", "is_strict_utf8_string", "is_strict_utf8_string_loc", "is_strict_utf8_string_loclen", "is_c9strict_utf8_string", "is_c9strict_utf8_string_loc", и "is_c9strict_utf8_string_loclen".

bool  is_utf8_string_flags(const U8 *s, STRLEN len,
                           const U32 flags)
is_utf8_string_loc

Аналогично "is_utf8_string", но сохраняет местоположение ошибки (в случае "ошибки utf8") или местоположение s+len (в случае "успеха utf8") в указателе ep.

См. также "is_utf8_string_loclen".

bool  is_utf8_string_loc(const U8 *s, const STRLEN len,
                         const U8 **ep)
is_utf8_string_loclen

Аналогично "is_utf8_string", но сохраняет местоположение ошибки (в случае "ошибки utf8") или местоположение s+len (в случае "успеха utf8") в указателе ep, и количество кодированных символов UTF-8 в указателе el.

См. также "is_utf8_string_loc".

bool  is_utf8_string_loclen(const U8 *s, STRLEN len,
                            const U8 **ep, STRLEN *el)
is_utf8_string_loclen_flags

Аналогично "is_utf8_string_flags", но сохраняет местоположение ошибки (в случае "ошибки utf8") или местоположение s+len (в случае "успеха utf8") в указателе ep, и количество кодированных символов UTF-8 в указателе el.

См. также "is_utf8_string_loc_flags".

bool  is_utf8_string_loclen_flags(const U8 *s, STRLEN len,
                                  const U8 **ep, STRLEN *el,
                                  const U32 flags)
is_utf8_string_loc_flags

Аналогично "is_utf8_string_flags", но сохраняет местоположение ошибки (в случае "ошибки utf8") или местоположение s+len (в случае "успеха utf8") в указателе ep.

См. также "is_utf8_string_loclen_flags".

bool  is_utf8_string_loc_flags(const U8 *s, STRLEN len,
                               const U8 **ep, const U32 flags)
is_utf8_valid_partial_char

Возвращает 0, если последовательность байтов, начинающаяся с s и не выходящая за пределы e - 1, является кодировкой UTF-8, расширенной Perl, для одного или нескольких кодов. В противном случае, возвращает 1, если существует хотя бы одна непустая последовательность байтов, которая, когда добавляется к последовательности s, начиная с позиции e, вызывает всю последовательность для корректной UTF-8 для некоторого кода; в противном случае возвращает 0.

Другими словами, это возвращает TRUE, если s указывает на частичный UTF-8 кодированный код.

Это полезно, когда проверяется буфер фиксированной длины на соответствие UTF-8, но последние несколько байтов в нем не образуют полный символ; то есть, он разделен где-то посредине конечного представления UTF-8 конечного символа. (Предположительно, когда буфер обновляется следующей частью данных, новые начальные байты завершат частичный код.) Эта функция используется для проверки, что последние байты в текущем буфере на самом деле являются законным началом некоторого кода, так что если они не являются таковыми, ошибка может быть сигнализирована, не дожидаясь следующего чтения.

bool  is_utf8_valid_partial_char(const U8 * const s0,
                                 const U8 * const e)
is_utf8_valid_partial_char_flags

Как и "is_utf8_valid_partial_char", она возвращает булево значение, указывающее, является ли входной данные допустимым частичным символом UTF-8, но принимает дополнительный параметр, flags, который может дополнительно ограничить допустимые кодовые точки.

Если flags равно 0, это поведение идентично "is_utf8_valid_partial_char". В противном случае flags может быть любой комбинацией флагов UTF8_DISALLOW_foo, принятых "utf8n_to_uvchr". Если существует последовательность байтов, которая может завершить частичный символ таким образом, что образуется разрешённый символ, функция возвращает TRUE; в противном случае FALSE. Кодовые точки, не являющиеся символами, не могут быть определены на основе частичного ввода символа. Но многие другие возможные исключённые типы могут быть определены только по первому или двум байтам.

bool  is_utf8_valid_partial_char_flags(const U8 * const s0,
                                       const U8 * const e,
                                       const U32 flags)
isUTF8_CHAR

Принимает ненулевое значение, если первые байты строки, начиная с позиции s и не дальше, чем e - 1, являются хорошо сформированными UTF-8, расширенными Perl, представляющими некоторую кодовую точку; в противном случае принимает значение 0. Если ненулевое, значение показывает, сколько байтов, начиная с позиции s, составляют представление кодовой точки. Любые байты, оставшиеся до e, но идущие после байтов, необходимых для формирования первой кодовой точки в s, не проверяются.

Кодовая точка может быть любой, которая поместится в IV на этом компьютере, используя расширение Perl для официального UTF-8 для представления кодовых точек, больших, чем максимальная точка Unicode 0x10FFFF. Это означает, что данная макрокоманда используется для эффективного определения, являются ли следующие байты в s допустимым UTF-8 для одного символа.

Используйте "isSTRICT_UTF8_CHAR", чтобы ограничить допустимые кодовые точки теми, которые определены Unicode для полной взаимозаменяемости между приложениями; "isC9_STRICT_UTF8_CHAR", чтобы использовать определение допустимых кодовых точек из Поправки Unicode #9; и "isUTF8_CHAR_flags", для более настраиваемого определения.

Используйте "is_utf8_string", "is_utf8_string_loc", и "is_utf8_string_loclen", чтобы проверить целые строки.

Обратите также внимание, что "инвариантный" символ UTF-8 (например, ASCII на машинах без EBCDIC) является допустимым символом UTF-8.

Size_t  isUTF8_CHAR(const U8 * const s0, const U8 * const e)
isUTF8_CHAR_flags

Принимает ненулевое значение, если первые несколько байтов строки, начиная с позиции s и не дальше, чем e - 1, являются хорошо сформированными UTF-8, расширенными Perl, представляющими некоторую кодовую точку, с учётом ограничений, заданных flags; в противном случае принимает значение 0. Если ненулевое, значение показывает, сколько байтов, начиная с позиции s, составляют представление кодовой точки. Любые байты, оставшиеся до e, но идущие после байтов, необходимых для формирования первой кодовой точки в s, не проверяются.

Если flags равно 0, это даёт те же результаты, что и "isUTF8_CHAR"; если flags равно UTF8_DISALLOW_ILLEGAL_INTERCHANGE, это даёт те же результаты, что и "isSTRICT_UTF8_CHAR"; а если flags равно UTF8_DISALLOW_ILLEGAL_C9_INTERCHANGE, это даёт те же результаты, что и "isC9_STRICT_UTF8_CHAR". В противном случае flags может быть любой комбинацией флагов UTF8_DISALLOW_foo, понятых "utf8n_to_uvchr", с теми же значениями.

Три альтернативные макрокоманды предназначены для самых часто используемых проверок; они, вероятно, будут работать немного быстрее, чем эта более общая команда, так как их можно включить в ваш код.

Используйте "is_utf8_string_flags", "is_utf8_string_loc_flags" и "is_utf8_string_loclen_flags" для проверки целых строк.

Size_t  isUTF8_CHAR_flags(const U8 * const s0, const U8 * const e,
                          const U32 flags)
LATIN1_TO_NATIVE

Возвращает эквивалент кодовой точки Latin-1 для входной кодовой точки (включая ASCII и управляющие символы), заданной ch. Таким образом, LATIN1_TO_NATIVE(66) на платформах EBCDIC возвращает 194. Каждая из них представляет символ "B" на соответствующих платформах. На платформах ASCII преобразование не требуется, поэтому эта макрокоманда расширяется только до своего входа, не добавляя требований по времени и памяти к реализации.

Для преобразования кодовых точек, потенциально больших, чем помещаются в символ, используйте "UNI_TO_NATIVE".

U8  LATIN1_TO_NATIVE(U8 ch)
NATIVE_TO_LATIN1

Возвращает эквивалент кодовой точки Latin-1 (включая ASCII и управляющие символы) для входной кодовой точки, заданной ch. Таким образом, NATIVE_TO_LATIN1(193) на платформах EBCDIC возвращает 65. Каждая из них представляет символ "A" на соответствующих платформах. На платформах ASCII преобразование не требуется, поэтому эта макрокоманда расширяется только до своего входа, не добавляя требований по времени и памяти к реализации.

Для преобразования кодовых точек, потенциально больших, чем помещаются в символ, используйте "NATIVE_TO_UNI".

U8  NATIVE_TO_LATIN1(U8 ch)
NATIVE_TO_UNI

Возвращает Unicode эквивалент входной кодовой точки, заданной ch. Таким образом, NATIVE_TO_UNI(195) на платформах EBCDIC возвращает 67. Каждая из них представляет символ "C" на соответствующих платформах. На платформах ASCII преобразование не требуется, поэтому эта макрокоманда расширяется только до своего входа, не добавляя требований по времени и памяти к реализации.

UV  NATIVE_TO_UNI(UV ch)
pv_uni_display

Создаёт в скаляре dsv отображаемую версию строки UTF-8 spv, длиной len, причём отображаемая версия имеет длину не более pvlim байтов (если длиннее, остальная часть усекается, и добавляется "...").

Аргумент flags может иметь UNI_DISPLAY_ISPRINT для отображения отображаемых символов как таковых, UNI_DISPLAY_BACKSLASH для отображения символов как обрамленных обратным слешем (как "\n") (UNI_DISPLAY_BACKSLASH предпочтительнее UNI_DISPLAY_ISPRINT для "\\"). UNI_DISPLAY_QQ (и его псевдоним UNI_DISPLAY_REGEX) включают как UNI_DISPLAY_BACKSLASH, так и UNI_DISPLAY_ISPRINT.

Кроме того, теперь имеется UNI_DISPLAY_BACKSPACE, что позволяет \b для клавиши Backspace, но только когда также установлен UNI_DISPLAY_BACKSLASH.

Возвращается указатель на PV dsv.

См. также "sv_uni_display".

char*  pv_uni_display(SV *dsv, const U8 *spv, STRLEN len,
                      STRLEN pvlim, UV flags)
REPLACEMENT_CHARACTER_UTF8

Это макрокоманда, которая возвращает строковую константу байтов UTF-8, определяющих символ ЗАМЕЩЕНИЯ Unicode (U+FFFD) для платформы, на которой скомпилирован Perl. Это позволяет коду использовать мнемоническое обозначение для этого символа, которое работает как на платформах ASCII, так и EBCDIC. sizeof(REPLACEMENT_CHARACTER_UTF8) - 1 может быть использовано для получения его длины в байтах.

sv_cat_decode

encoding предполагается объектом Encode, PV ssv предполагается октетами в этом кодировании, и декодирование входных данных начинается с позиции, на которую указывает (PV + *offset). dsv будет конкатенирован с декодированной UTF-8 строкой из ssv. Декодирование прекратится, когда в выходных данных декодирования появится строка tstr или входные данные закончатся в PV ssv. Значение, на которое указывает offset, будет изменено на последнюю позицию ввода в ssv.

Возвращает TRUE, если был найден терминатор, иначе FALSE.

bool  sv_cat_decode(SV* dsv, SV *encoding, SV *ssv, int *offset,
                    char* tstr, int tlen)
sv_recode_to_utf8

encoding предполагается объектом Encode, при входе PV sv предполагается октетами в этом кодировании, и sv будет перекодирован в Unicode (и UTF-8).

Если sv уже является UTF-8 (или если это не POK), или если encoding не является ссылкой, к sv ничего не делается. Если encoding не является объектом кодирования Encode::XS, произойдёт что-то плохое. (См. encoding и Encode.)

Возвращается PV sv.

char*  sv_recode_to_utf8(SV* sv, SV *encoding)
sv_uni_display

Создаёт в скаляре dsv отображаемую версию скаляра sv, причём отображаемая версия имеет длину не более pvlim байтов (если длиннее, остальная часть усекается, и добавляется "...").

Аргумент flags такой же, как в "pv_uni_display"().

Возвращается указатель на PV dsv.

char*  sv_uni_display(SV *dsv, SV *ssv, STRLEN pvlim, UV flags)
UNICODE_IS_NONCHAR

Возвращает булево значение, указывающее, является ли uv одной из кодовых точек Unicode, не являющихся символами.

bool  UNICODE_IS_NONCHAR(const UV uv)
UNICODE_IS_REPLACEMENT

Возвращает булево значение, указывающее, является ли uv символом ЗАМЕЩЕНИЯ Unicode.

bool  UNICODE_IS_REPLACEMENT(const UV uv)
UNICODE_IS_SUPER

Возвращает булево значение, указывающее, превышает ли uv максимальную допустимую кодовую точку Unicode U+10FFFF.

bool  UNICODE_IS_SUPER(const UV uv)
UNICODE_IS_SURROGATE

Возвращает булево значение, указывающее, является ли uv одной из кодовых точек замещения Unicode.

bool  UNICODE_IS_SURROGATE(const UV uv)
UNICODE_REPLACEMENT

Принимает значение 0xFFFD, кодовую точку символа ЗАМЕЩЕНИЯ Unicode.

UNI_TO_NATIVE

Возвращает эквивалент кодовой точки Unicode для входной кодовой точки, заданной ch. Таким образом, NATIVE_TO_LATIN1(193) на платформах EBCDIC возвращает 196. Каждая из них представляет символ "D" на соответствующих платформах. На платформах ASCII преобразование не требуется, поэтому эта макрокоманда расширяется только до своего входа, не добавляя требований по времени и памяти к реализации.

UV  UNI_TO_NATIVE(UV ch)
utf8n_to_uvchr

ЭТУ ФУНКЦИЮ СЛЕДУЕТ ИСПОЛЬЗОВАТЬ ТОЛЬКО В ОЧЕНЬ СПЕЦИАЛЬНЫХ СЛУЧАЯХ. Большинство кодов должны использовать "utf8_to_uvchr_buf"() вместо прямого вызова.

Процедура декодирования UTF-8 нижнего уровня. Возвращает значение кода символа первого символа в строке s, которая предполагается в кодировке UTF-8 (или UTF-EBCDIC), и не длиннее curlen байт; *retlen (если retlen не NULL) будет установлено в длину этого символа в байтах.

Значение flags определяет поведение при отсутствии в s корректно сформированного символа UTF-8. Если flags равно 0, обнаружение некорректного символа приводит к возвращению нуля и *retlen устанавливается так, что (s + *retlen) является следующей возможной позицией в s, которая могла бы начать корректный символ. Кроме того, если предупреждения UTF-8 не отключены лексически, поднимается предупреждение. Некоторые последовательности входных данных UTF-8 могут содержать несколько некорректностей. Данная функция пытается найти все возможные некорректности в каждом вызове, поэтому для одной и той же последовательности могут быть подняты несколько предупреждений.

Различные флаги ALLOW могут быть установлены в flags для разрешения (и отсутствия предупреждений) отдельных типов некорректностей, таких как слишком длинная последовательность (то есть, когда существует более короткая последовательность, которая может выразить тот же символ; слишком длинные последовательности прямо запрещены в стандарте UTF-8 из-за потенциальных проблем безопасности). Другой пример некорректности — первый байт символа, не являющийся допустимым первым байтом. Список таких флагов см. в utf8.h. Даже если это разрешено, эта функция обычно возвращает заменяющий символ Unicode при обнаружении некорректности. В utf8.h есть флаги для переопределения этого поведения для избыточных некорректностей, но не используйте их, за исключением очень специализированных целей.

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

Обратите внимание, что этот API требует разграничения успешного декодирования символа NUL, и возврата ошибки (если не установлен флаг UTF8_CHECK_ONLY), так как в обоих случаях возвращается 0, а в зависимости от некорректности retlen может быть установлено в 1. Чтобы разграничить, при возврате нуля, проверьте, равен ли первый байт s 0. Если да, вход был NUL; если нет, вход имел ошибку. Или вы можете использовать "utf8n_to_uvchr_error".

Некоторые коды символов считаются проблемными. Это суррогаты Unicode, не-символы Unicode и коды символов, превышающие максимальное значение Unicode 0x10FFFF. По умолчанию они считаются обычными символами, но в определённых ситуациях требуется специальная обработка, которую можно указать с помощью параметра flags. Если flags содержит UTF8_DISALLOW_ILLEGAL_INTERCHANGE, все три класса обрабатываются как некорректности. Флаги UTF8_DISALLOW_SURROGATE, UTF8_DISALLOW_NONCHAR, и UTF8_DISALLOW_SUPER (означающие значения выше допустимого максимума Unicode) могут быть установлены, чтобы отдельно запретить эти категории. UTF8_DISALLOW_ILLEGAL_INTERCHANGE ограничивает допустимые входные данные строго определёнными UTF-8, традиционно определёнными Unicode. Используйте UTF8_DISALLOW_ILLEGAL_C9_INTERCHANGE, чтобы использовать определение строгости, данное Поправкой Unicode №9. Разница между традиционной строгостью и строгостью C9 заключается в том, что последняя не запрещает символов, не являющихся символами. (Однако они всё ещё не рекомендуются.) Более подробное обсуждение см. в "Символы, не являющиеся символами" в perlunicode.

Флаги UTF8_WARN_ILLEGAL_INTERCHANGE, UTF8_WARN_ILLEGAL_C9_INTERCHANGE, UTF8_WARN_SURROGATE, UTF8_WARN_NONCHAR, и UTF8_WARN_SUPER приведут к появлению предупреждающих сообщений для соответствующих категорий, но в противном случае символы считаются допустимыми (не некорректными). Чтобы заставить категорию одновременно обрабатываться как некорректную и выводить предупреждение, укажите оба флага WARN и DISALLOW. (Но обратите внимание, что предупреждения не выводятся, если они лексически отключены или если также указан UTF8_CHECK_ONLY).

Экстремально высокие коды символов никогда не были указаны в каком-либо стандарте и требуют расширения UTF-8 для их выражения, что Perl делает. Вероятно, программы, написанные не на Perl, не смогут читать файлы, содержащие эти символы; также Perl не сможет понять файлы, написанные чем-то, использующим другое расширение. По этим причинам есть отдельный набор флагов, которые могут выводить предупреждения и/или запрещать эти чрезвычайно высокие коды символов, даже если другие символы, выше Unicode, принимаются. Это флаги UTF8_WARN_PERL_EXTENDED и UTF8_DISALLOW_PERL_EXTENDED. Для получения дополнительной информации см. "UTF8_GOT_PERL_EXTENDED". Конечно, UTF8_DISALLOW_SUPER будет обрабатывать все коды символов, превышающие Unicode, включая эти, как некорректные. (Обратите внимание, что стандарт Unicode считает все значения выше 0x10FFFF недопустимыми, но есть стандарты, предшествующие ему, которые допускают значения до 0x7FFF_FFFF (2**31 -1))

Несколько вводящий в заблуждение синоним для UTF8_WARN_PERL_EXTENDED сохраняется для обратной совместимости: UTF8_WARN_ABOVE_31_BIT. Аналогично, UTF8_DISALLOW_ABOVE_31_BIT может использоваться вместо более точно названного UTF8_DISALLOW_PERL_EXTENDED. Названия вводят в заблуждение, потому что эти флаги могут применяться к кодам символов, которые фактически помещаются в 31 бит. Это происходит на платформах EBCDIC и иногда, когда присутствует также некорректность избыточной последовательности. Новые имена точно описывают ситуацию во всех случаях.

Все остальные коды символов, соответствующие символам Unicode, включая символы частного использования и те, которые ещё не назначены, никогда не считаются некорректными и никогда не приводят к предупреждениям.

UV  utf8n_to_uvchr(const U8 *s, STRLEN curlen, STRLEN *retlen,
                   const U32 flags)
utf8n_to_uvchr_error

ЭТУ ФУНКЦИЮ СЛЕДУЕТ ИСПОЛЬЗОВАТЬ ТОЛЬКО В ОЧЕНЬ СПЕЦИАЛЬНЫХ СЛУЧАЯХ. Большинство кодов должно использовать "utf8_to_uvchr_buf"() вместо прямого вызова.

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

Она похожа на "utf8n_to_uvchr", но принимает дополнительный параметр, расположенный после всех остальных, errors. Если этот параметр равен 0, эта функция ведет себя идентично "utf8n_to_uvchr". В противном случае, errors должен быть указателем на переменную U32, которую эта функция устанавливает, чтобы указать на любые обнаруженные ошибки. При возврате, если *errors равно 0, ошибок не найдено. В противном случае, *errors является битовым OR битов, описанных в списке ниже. Некоторые из этих битов будут установлены, если обнаружено несоответствие, даже если входной параметр flags указывает, что данное несоответствие разрешено; эти исключения отмечены:

UTF8_GOT_PERL_EXTENDED

Последовательность ввода не является стандартным UTF-8, а расширением Perl. Этот бит устанавливается только если входной параметр flags содержит флаги UTF8_DISALLOW_PERL_EXTENDED или UTF8_WARN_PERL_EXTENDED.

Кодовые точки выше 0x7FFF_FFFF (2**31 - 1) никогда не были определены в каком-либо стандарте, поэтому необходимо использовать какое-то расширение для их выражения. Perl использует естественное расширение UTF-8 для представления кодовых точек до 2**36-1 и придумал дополнительное расширение для представления ещё больших, так что любая кодовая точка, которая помещается в 64-битовое слово, может быть представлена. Текст, использующий эти расширения, вряд ли будет переносимым в код, не использующий Perl. Мы объединяем оба эти расширения и называем их расширенным UTF-8 Perl. Существуют и другие расширения, придуманные другими людьми, несовместимые с расширением Perl.

На платформах EBCDIC начиная с Perl v5.24, расширение Perl для представления очень больших кодовых точек включается при 0x3FFF_FFFF (2**30 -1), что ниже, чем на ASCII. До этого кодовые точки 2**31 и выше просто не представлялись, и использовался другой, несовместимый метод для представления кодовых точек между 2**30 и 2**31 - 1.

На обеих платформах, ASCII и EBCDIC, устанавливается бит UTF8_GOT_PERL_EXTENDED, если используется расширенный UTF-8 Perl.

В более ранних версиях Perl этот бит назывался UTF8_GOT_ABOVE_31_BIT, который вы по-прежнему можете использовать для обратной совместимости. Это название вводит в заблуждение, так как этот флаг может быть установлен, когда кодовая точка фактически помещается в 31 бит. Это происходит на платформах EBCDIC и иногда, когда присутствует также несоответствие в виде избыточной последовательности. Новое имя точно описывает ситуацию во всех случаях.

UTF8_GOT_CONTINUATION

Последовательность ввода была некорректной, так как первый байт был продолжением UTF-8.

UTF8_GOT_EMPTY

Входной параметр curlen был равен 0.

UTF8_GOT_LONG

Последовательность ввода была некорректной, так как существует другая последовательность, которая оценивается как та же кодовая точка, но эта последовательность короче.

До Unicode 3.1 программы могли принимать это несоответствие, но было обнаружено, что это создаёт проблемы безопасности.

UTF8_GOT_NONCHAR

Кодовая точка, представленная введенной последовательностью UTF-8, относится к кодовой точке Unicode, не являющейся символом. Этот бит устанавливается только если входной параметр flags содержит либо флаг UTF8_DISALLOW_NONCHAR, либо флаг UTF8_WARN_NONCHAR.

UTF8_GOT_NON_CONTINUATION

Последовательность ввода была некорректной, так как в позиции, где должен быть байт-продолжение, был найден байт не являющийся байтом-продолжением. См. также "UTF8_GOT_SHORT".

UTF8_GOT_OVERFLOW

Последовательность ввода была некорректной, так как она относится к кодовой точке, которая не может быть представлена в доступном количестве битов в IV на текущей платформе.

UTF8_GOT_SHORT

Последовательность ввода была некорректной, так как curlen меньше, чем требуется для полной последовательности. Другими словами, вход представляет собой частичную последовательность символов.

UTF8_GOT_SHORT и UTF8_GOT_NON_CONTINUATION оба указывают на слишком короткую последовательность. Разница в том, что UTF8_GOT_NON_CONTINUATION всегда указывает на ошибку, в то время как UTF8_GOT_SHORT означает, что была просмотрена неполная последовательность. Если других флагов нет, это означает, что последовательность была корректной в той части, которая была просмотрена. В зависимости от приложения, это может означать одно из трёх:

  • Параметр длины curlen , переданный в функцию, был слишком мал, и функция не смогла проверить все необходимые байты.

  • Буфер, на который обращались, основывается на чтении данных, и данные до сих пор были получены в середине символа, так что следующее чтение прочитает оставшуюся часть этого символа. (Отправитель сам должен каким-то образом обработать разделённые байты).

  • Это реальная ошибка, и частичная последовательность — всё, что мы получим.

UTF8_GOT_SUPER

Последовательность ввода была некорректной, так как она относится к кодовой точке, не являющейся точкой Unicode; то есть, к точке, превышающей допустимый максимальный предел Unicode. Этот бит устанавливается только если входной параметр flags содержит либо флаг UTF8_DISALLOW_SUPER, либо флаг UTF8_WARN_SUPER.

UTF8_GOT_SURROGATE

Последовательность ввода была некорректной, так как она относится к суррогатной кодовой точке UTF-16 Unicode. Этот бит устанавливается только если входной параметр flags содержит либо флаг UTF8_DISALLOW_SURROGATE, либо флаг UTF8_WARN_SURROGATE.

Чтобы самостоятельно обрабатывать ошибки, вызовите эту функцию со флагом UTF8_CHECK_ONLY для подавления предупреждений, а затем проверьте значение возврата *errors.

UV  utf8n_to_uvchr_error(const U8 *s, STRLEN curlen,
                         STRLEN *retlen, const U32 flags,
                         U32 * errors)
utf8n_to_uvchr_msgs

ЭТУ ФУНКЦИЮ СЛЕДУЕТ ИСПОЛЬЗОВАТЬ ТОЛЬКО В ОЧЕНЬ СПЕЦИАЛЬНЫХ СЛУЧАЯХ. Большинство кодов должно использовать "utf8_to_uvchr_buf"() вместо прямого вызова.

Эта функция предназначена для кодов, которые нуждаются в точном определении несоответствий при обнаружении ошибки и желают получить соответствующие предупреждающие и/или сообщения об ошибках, которые возвращаются вызывающей стороне вместо отображения. Все сообщения, которые были бы отображены, если бы все лексические предупреждения были включены, будут возвращены.

Она просто аналогична "utf8n_to_uvchr_error" , но принимает дополнительный параметр, расположенный после всех остальных, msgs. Если этот параметр равен 0, эта функция ведет себя идентично "utf8n_to_uvchr_error". В противном случае, msgs должен указывать на переменную AV *, в которой эта функция создаёт новый массив AV, содержащий все соответствующие сообщения. Элементы массива упорядочены так, что первое сообщение, которое было бы отображено, находится в 0-м элементе и так далее. Каждый элемент является хэш-таблицей с тремя парами «ключ-значение» следующим образом:

text

Текст сообщения как SVpv.

warn_categories

Категория предупреждения (или категории), упакованные в SVuv.

flag

Один бит флага, связанный с этим сообщением, в виде SVuv. Бит соответствует некоторому биту в значении возврата *errors, например, UTF8_GOT_LONG.

Важно отметить, что указание этого параметра как отличного от нуля приведёт к подавлению любых предупреждений, которые эта функция могла бы сгенерировать, и вместо этого они будут помещены в *msgs. Вызывающая сторона может проверить состояние лексических предупреждений (или нет), выбирая, что делать с возвращёнными сообщениями.

Если флаг UTF8_CHECK_ONLY передан, никакие предупреждения не генерируются, и, следовательно, AV не создаётся.

Вызывающая сторона, конечно, несет ответственность за освобождение любого возвращённого массива AV.

UV  utf8n_to_uvchr_msgs(const U8 *s, STRLEN curlen,
                        STRLEN *retlen, const U32 flags,
                        U32 * errors, AV ** msgs)
UTF8SKIP

возвращает количество байтов неиспорченного кодированного символа UTF-8, первый (возможно, единственный) байт которого указан по адресу s.

Если существует возможность некорректного ввода, используйте вместо этого:

"UTF8_SAFE_SKIP" если вы знаете максимальный указатель окончания в буфере, указанном по адресу s; или
"UTF8_CHK_SKIP" если вы этого не знаете.

Лучше перестроить ваш код так, чтобы указатель окончания передавался в качестве параметра, чтобы вы знали его в момент вызова этой функции, но если это невозможно, "UTF8_CHK_SKIP" может уменьшить вероятность доступа за пределы входного буфера.

STRLEN  UTF8SKIP(char* s)
UTF8_CHK_SKIP

Это более безопасная версия "UTF8SKIP", но всё ещё не так безопасна, как "UTF8_SAFE_SKIP". Эта версия не слепо предполагает, что входная строка, указанная по адресу s, правильная, но проверяет, что не существует символа NUL перед ожидаемым окончанием следующего символа в s. Длина UTF8_CHK_SKIP заканчивается непосредственно перед таким символом NUL.

Perl часто добавляет NUL-символы в качестве меры предосторожности после окончания строк в SV, поэтому вероятно, что использование этой макрокоманды предотвратит непреднамеренный доступ за пределы входного буфера, даже если он некорректно закодирован в UTF-8.

Эта макрокоманда предназначена для использования модулями XS, где входные данные могут быть некорректными, и перестройка для использования более безопасной "UTF8_SAFE_SKIP", например, при взаимодействии с библиотекой C, невозможна.

STRLEN  UTF8_CHK_SKIP(char* s)
utf8_distance

Возвращает количество символов UTF-8 между указателями UTF-8 a и b.

ВНИМАНИЕ: использовать только если вы *знаете*, что указатели находятся внутри одного и того же буфера UTF-8.

IV  utf8_distance(const U8 *a, const U8 *b)
utf8_hop

Возвращает указатель UTF-8 s, смещённый на off символов вперёд или назад.

ВНИМАНИЕ: не используйте это, если вы *не уверены*, что off находится в области данных UTF-8, на которую указывает s *и* что s на входе выровнен на первом байте символа или сразу после последнего байта символа.

U8*  utf8_hop(const U8 *s, SSize_t off)
utf8_hop_back

Возвращает указатель UTF-8 s, смещённый на до off символов назад.

off должно быть неположительным.

s должно быть после или равно start.

При движении назад, он не будет перемещаться до start.

Не будет превышать этот предел даже если строка не является валидным "UTF-8".

U8*  utf8_hop_back(const U8 *s, SSize_t off, const U8 *start)
utf8_hop_forward

Возвращает указатель на символ UTF-8 s смещённый вперёд на не более чем off символов.

off должно быть неотрицательным.

s должен быть равен или находиться до end.

При движении вперёд, смещение не будет превышать end.

Этот предел не будет превышен, даже если строка не является корректной UTF-8 последовательностью.

U8*  utf8_hop_forward(const U8 *s, SSize_t off, const U8 *end)
utf8_hop_safe

Возвращает указатель на символ UTF-8 s смещённый вперёд или назад на не более чем off символов.

При движении назад, смещение не будет меньше start.

При движении вперёд, смещение не будет превышать end.

Эти пределы не будут превышены, даже если строка не является корректной UTF-8 последовательностью.

U8*  utf8_hop_safe(const U8 *s, SSize_t off, const U8 *start,
                   const U8 *end)
UTF8_IS_INVARIANT

Возвращает 1, если байт c представляет тот же символ при кодировке UTF-8, что и без неё; в противном случае возвращает 0. Неизменяемые символы UTF-8 можно копировать как есть при преобразовании в/из UTF-8, что экономит время.

Несмотря на название, эта макрокоманда даёт правильный результат, даже если входная строка, из которой взят c, не закодирована в UTF-8.

См. "UVCHR_IS_INVARIANT" для проверки, является ли UV неизменяемым.

bool  UTF8_IS_INVARIANT(char c)
UTF8_IS_NONCHAR

Возвращает ненулевое значение, если первые несколько байтов строки, начиная с s и не дальше, чем e - 1, являются корректной UTF-8 последовательностью, представляющей один из кодовых точек Unicode, не являющихся символами; в противном случае возвращает 0. Если ненулевое, возвращаемое значение показывает количество байтов, начиная с s, которые составляют представление кодовой точки.

bool  UTF8_IS_NONCHAR(const U8 *s, const U8 *e)
UTF8_IS_REPLACEMENT

Возвращает ненулевое значение, если первые несколько байтов строки, начиная с s и не дальше, чем e - 1, являются корректной UTF-8 последовательностью, представляющей заменяющий символ Unicode; в противном случае возвращает 0. Если ненулевое, возвращаемое значение показывает количество байтов, начиная с s, которые составляют представление кодовой точки.

bool  UTF8_IS_REPLACEMENT(const U8 *s, const U8 *e)
UTF8_IS_SUPER

Обратите внимание, что Perl распознаёт расширение UTF-8, которое может кодировать кодовые точки, большие, чем определённые Unicode, которые находятся в диапазоне от 0 до 0x10FFFF.

Эта макрокоманда возвращает ненулевое значение, если первые несколько байтов строки, начиная с s и не дальше, чем e - 1, принадлежат этому расширению UTF-8; в противном случае возвращает 0. Если ненулевое, возвращаемое значение показывает количество байтов, начиная с s, которые составляют представление кодовой точки.

0 возвращается, если байты не являются корректной расширенной UTF-8 последовательностью или если они представляют кодовую точку, которая не может поместиться в UV на текущей платформе. Следовательно, эта макрокоманда может давать разные результаты при выполнении на 64-битной машине и на машине с 32-битным размером слова.

Обратите внимание, что в Perl запрещено использовать кодовые точки, которые больше, чем могут поместиться в IV на текущей машине; и запрещено в Unicode иметь любые кодовые точки, которые подходят под эту макрокоманду

bool  UTF8_IS_SUPER(const U8 *s, const U8 *e)
UTF8_IS_SURROGATE

Возвращает ненулевое значение, если первые несколько байтов строки, начиная с s и не дальше, чем e - 1, являются корректной UTF-8 последовательностью, представляющей одну из кодовых точек-супплементов Unicode; в противном случае возвращает 0. Если ненулевое, возвращаемое значение показывает количество байтов, начиная с s, которые составляют представление кодовой точки.

bool  UTF8_IS_SURROGATE(const U8 *s, const U8 *e)
utf8_length

Возвращает количество символов в последовательности байтов UTF-8, начинающейся с s и заканчивающейся байтом перед e. Если <s> и <e> указывают на одну и ту же позицию, возвращает 0 без вывода предупреждения.

Если e < s или если сканирование выйдет за пределы e, выводится предупреждение UTF8 и возвращается количество корректных символов.

STRLEN  utf8_length(const U8* s, const U8 *e)
UTF8_MAXBYTES

Максимальная ширина одного символа UTF-8, в байтах.

ПРИМЕЧАНИЕ: Строго говоря, UTF-8 в Perl не должен называться UTF-8, так как UTF-8 является кодировкой Unicode, а верхний предел Unicode, 0x10FFFF, может быть выражен 4 байтами. Однако Perl рассматривает UTF-8 как способ кодирования целых неотрицательных чисел в двоичном формате, даже тех, которые находятся за пределами Unicode.

UTF8_MAXBYTES_CASE

Максимальное количество байтов UTF-8, которые один символ Unicode может преобразовать в верхний/нижний регистр/заголовок/выровнять.

UTF8_SAFE_SKIP

Возвращает 0, если s >= e; в противном случае возвращает количество байтов в символе UTF-8, первый байт которого указывается s. Но никогда не возвращает значение свыше e. В сборках отладки это выражение assert s <= e.

STRLEN  UTF8_SAFE_SKIP(char* s, char* e)
UTF8_SKIP

Это синоним для "UTF8SKIP"

STRLEN  UTF8_SKIP(char* s)
utf8_to_bytes

ПРИМЕЧАНИЕ: utf8_to_bytes является экспериментальным и может быть изменён или удалён без предварительного уведомления.

Преобразует строку "s" длиной *lenp из UTF-8 в кодировку нативных байтов. В отличие от "bytes_to_utf8", эта функция перезаписывает исходную строку и обновляет *lenp для указания новой длины. Возвращает ноль при ошибке (оставляя "s" без изменений) и устанавливает *lenp в -1.

После успешного возврата количество вариантов в строке можно вычислить, сохранив значение *lenp перед вызовом и вычитая значение *lenp после вызова из него.

Если вам нужна копия строки, см. "bytes_from_utf8".

U8*  utf8_to_bytes(U8 *s, STRLEN *lenp)
utf8_to_uvchr

DEPRECATED! планируется удалить utf8_to_uvchr из будущей версии Perl. Не используйте его для нового кода; удалите его из существующего кода.

Возвращает кодовую точку нативного символа первого символа в строке s, которая предполагается в кодировке UTF-8; retlen будет установлен равным длине этого символа в байтах.

Некоторые, но не все, искажения UTF-8 обнаруживаются, и, в действительности, некоторые неправильно сформированные входные данные могут привести к чтению за пределы буфера ввода, вот почему эта функция устарела. Используйте "utf8_to_uvchr_buf" вместо неё.

Если s указывает на одно из обнаруженных искажений, и предупреждения UTF8 включены, возвращается ноль, и *retlen устанавливается (если retlen не NULL) в -1. Если эти предупреждения отключены, вычисленное значение, если оно корректно определено (или заменяющий символ Unicode, если нет), возвращается в молчаливом режиме, и *retlen устанавливается (если retlen не NULL), так что (s + *retlen) будет следующей возможной позицией в s, которая может начинаться с корректного символа. См. "utf8n_to_uvchr" для получения подробностей о возвращении заменяющего символа.

UV  utf8_to_uvchr(const U8 *s, STRLEN *retlen)
utf8_to_uvchr_buf

Возвращает кодовую точку нативного символа первого символа в строке s, которая предполагается в кодировке UTF-8; send указывает на позицию на 1 байт дальше конца s. *retlen будет установлен равным длине этого символа в байтах.

Если s не указывает на корректный символ UTF-8 и предупреждения UTF8 включены, возвращается ноль, и *retlen устанавливается (если retlen не NULL) в -1. Если эти предупреждения отключены, вычисленное значение, если оно корректно определено (или заменяющий символ Unicode, если нет), возвращается в молчаливом режиме, и *retlen устанавливается (если retlen не NULL) так, что (s + *retlen) будет следующей возможной позицией в s, которая может начинаться с корректного символа. См. "utf8n_to_uvchr" для получения подробностей о возвращении заменяющего символа.

UV  utf8_to_uvchr_buf(const U8 *s, const U8 *send, STRLEN *retlen)
UVCHR_IS_INVARIANT

Возвращает 1, если представление кодовой точки cp одинаково, независимо от того, закодирована ли она в UTF-8; в противном случае возвращает 0. Неизменяемые символы UTF-8 можно копировать как есть при преобразовании в/из UTF-8, что экономит время. cp является кодовой точкой Unicode, если она больше 255; в противном случае является кодовой точкой нативной платформы.

bool  UVCHR_IS_INVARIANT(UV cp)
UVCHR_SKIP

Возвращает количество байтов, необходимых для представления кодовой точки cp при кодировании как UTF-8. cp — это нативная (ASCII или EBCDIC) кодовая точка, если она меньше 255; в противном случае — кодовая точка Unicode.

STRLEN  UVCHR_SKIP(UV cp)
uvchr_to_utf8

Добавляет представление UTF-8 нативной кодовой точки uv в конец строки d; d должен иметь как минимум UVCHR_SKIP(uv)+1 (до UTF8_MAXBYTES+1) свободных байтов. Возвращаемое значение — указатель на байт после конца нового символа. Другими словами,

d = uvchr_to_utf8(d, uv);

является рекомендуемым способом работы с широкими символами нативного языка.

*(d++) = uv;

Эта функция принимает в качестве входных данных любую кодовую точку от 0 до IV_MAX. IV_MAX обычно равен 0x7FFF_FFFF в 32-битном слове.

Можно запретить или предупредить о кодовых точках, которые не являются Unicode или могут быть проблемными, используя "uvchr_to_utf8_flags".

U8*  uvchr_to_utf8(U8 *d, UV uv)
uvchr_to_utf8_flags

Добавляет UTF-8 представление нативного кодового пункта uv в конец строки d; у строки d должно быть как минимум UVCHR_SKIP(uv)+1 (до UTF8_MAXBYTES+1) свободных байтов. Возвращаемое значение — указатель на байт после конца нового символа. Другими словами,

d = uvchr_to_utf8_flags(d, uv, flags);

или, в большинстве случаев,

d = uvchr_to_utf8_flags(d, uv, 0);

Это — осознанный с точки зрения Юникода способ сказать

*(d++) = uv;

Если flags равно 0, эта функция принимает любой кодовый пункт от 0 до IV_MAX в качестве входных данных. IV_MAX обычно равно 0x7FFF_FFFF в 32-битном слове.

Указание flags может дополнительно ограничить разрешённые значения и не вызывать предупреждения, как показано ниже:

Если uv — суррогатный кодовый пункт Юникода, и UNICODE_WARN_SURROGATE установлено, функция сгенерирует предупреждение, при условии, что включены предупреждения UTF8. Если вместо этого установлено UNICODE_DISALLOW_SURROGATE, функция завершится ошибкой и вернёт NULL. Если оба флага установлены, функция сгенерирует предупреждение и вернёт NULL.

Аналогичным образом, флаги UNICODE_WARN_NONCHAR и UNICODE_DISALLOW_NONCHAR влияют на то, как функция обрабатывает некодовый символ Юникода.

И также флаги UNICODE_WARN_SUPER и UNICODE_DISALLOW_SUPER влияют на обработку кодовых пунктов, превышающих максимальное значение Юникода 0x10FFFF. Языки, отличные от Perl, могут не поддерживать файлы, содержащие эти символы.

Флаг UNICODE_WARN_ILLEGAL_INTERCHANGE выбирает все три вышеуказанных флага WARN; а UNICODE_DISALLOW_ILLEGAL_INTERCHANGE выбирает все три флага DISALLOW. UNICODE_DISALLOW_ILLEGAL_INTERCHANGE ограничивает допустимые входные данные строго определённым UTF-8, традиционно определяемым Юникодом. Аналогично, UNICODE_WARN_ILLEGAL_C9_INTERCHANGE и UNICODE_DISALLOW_ILLEGAL_C9_INTERCHANGE являются сокращениями для выбора флагов выше Юникода и суррогатных флагов, но не флагов некодовых символов, как определено в Поправке #9 к Юникоду. См. "Некодовые кодовые пункты" в perlunicode.

Очень большие кодовые пункты никогда не специфицировались в стандартах и требуют расширения UTF-8 для выражения, что Perl и делает. Вероятно, программы, написанные на языках, отличных от Perl, не смогут читать файлы, содержащие эти символы; и Perl не сможет понять файлы, записанные с использованием другого расширения. По этим причинам существует отдельный набор флагов, которые могут генерировать предупреждения и/или запрещать эти очень большие кодовые пункты, даже если другие кодовые пункты, превышающие Юникод, принимаются. Это флаги UNICODE_WARN_PERL_EXTENDED и UNICODE_DISALLOW_PERL_EXTENDED. Более подробная информация приведена в "UTF8_GOT_PERL_EXTENDED". Конечно, UNICODE_DISALLOW_SUPER будет рассматривать все кодовые пункты, превышающие Юникод, включая эти, как некорректные. (Обратите внимание, что стандарт Юникода считает все значения выше 0x10FFFF незаконными, но существуют стандарты, предшествующие ему, которые допускают значения до 0x7FFF_FFFF (2**31 -1)).

Для обеспечения обратной совместимости сохранено несколько вводящее в заблуждение синоним для UNICODE_WARN_PERL_EXTENDED: UNICODE_WARN_ABOVE_31_BIT. Аналогично, UNICODE_DISALLOW_ABOVE_31_BIT может использоваться вместо более точного синонима UNICODE_DISALLOW_PERL_EXTENDED. Эти названия вводят в заблуждение, поскольку на платформах EBCDIC эти флаги могут относиться к кодовым пунктам, которые на самом деле помещаются в 31 бит. Новые имена точно описывают ситуацию во всех случаях.

U8*  uvchr_to_utf8_flags(U8 *d, UV uv, UV flags)
uvchr_to_utf8_flags_msgs

ЭТУ ФУНКЦИЮ СЛЕДУЕТ ИСПОЛЬЗОВАТЬ ТОЛЬКО В ОЧЕНЬ СПЕЦИАЛЬНЫХ СЛУЧАЯХ.

Большинство кодов должно использовать "uvchr_to_utf8_flags"() вместо прямого вызова этой функции.

Эта функция предназначена для кодов, которые хотят, чтобы все предупреждения и/или сообщения об ошибках возвращались вызывающему коду, а не отображались. Все сообщения, которые отображались бы, если бы были включены все лексические предупреждения, будут возвращены.

Она аналогична "uvchr_to_utf8_flags", но принимает дополнительный параметр после всех остальных, msgs. Если этот параметр равен 0, эта функция ведет себя идентично "uvchr_to_utf8_flags". В противном случае, msgs должен быть указателем на переменную HV *, в которой эта функция создает новый HV для хранения соответствующих сообщений. Хэш содержит три пары ключ-значение, как показано ниже:

text

Текст сообщения в виде SVpv.

warn_categories

Категория (или категории) предупреждения, упакованные в SVuv.

flag

Один флаг, связанный с этим сообщением, в виде SVuv. Этот бит соответствует какому-то биту в возвращаемом значении *errors, например, UNICODE_GOT_SURROGATE.

Важно отметить, что указание этого параметра как не-null приведёт к подавлению любых предупреждений, которые эта функция могла бы сгенерировать, и вместо этого поместит их в *msgs. Вызывающий код может проверить состояние лексических предупреждений (или нет), чтобы решить, что делать с возвращенными сообщениями.

Конечно, вызывающая функция отвечает за освобождение любого возвращенного HV.

U8*  uvchr_to_utf8_flags_msgs(U8 *d, UV uv, UV flags, HV ** msgs)

Функции-утилиты

C_ARRAY_END

Возвращает указатель на элемент после последнего элемента входного массива C.

void *  C_ARRAY_END(void *a)
C_ARRAY_LENGTH

Возвращает количество элементов в входном массиве C (так что вы хотите, чтобы ваши индексы с нуля были меньше, но не равны).

STRLEN  C_ARRAY_LENGTH(void *a)
getcwd_sv

Заполните sv текущим рабочим каталогом

int  getcwd_sv(SV* sv)
IN_PERL_COMPILETIME

Возвращает 1, если этот макрос вызывается во время фазы компиляции программы; в противном случае 0;

bool  IN_PERL_COMPILETIME
IN_PERL_RUNTIME

Возвращает 1, если этот макрос вызывается во время фазы выполнения программы; в противном случае 0;

bool  IN_PERL_RUNTIME
IS_SAFE_SYSCALL

То же, что и "is_safe_syscall".

bool  IS_SAFE_SYSCALL(NN const char *pv, STRLEN len,
                      NN const char *what, NN const char *op_name)
is_safe_syscall

Проверяет, что заданное pv (длиной len) не содержит внутренних NUL символов. Если содержит, установить errno в ENOENT, при желании выдать предупреждение с использованием категории syscalls, и вернуть FALSE.

Возвращает TRUE, если имя безопасно.

what и op_name используются в любом предупреждении.

Используется макросом IS_SAFE_SYSCALL().

bool  is_safe_syscall(const char *pv, STRLEN len,
                      const char *what, const char *op_name)
my_setenv

Обёртка для библиотечной функции C setenv(3). Не используйте последнюю, так как в Perl-версии есть желаемые меры безопасности.

void  my_setenv(const char* nam, const char* val)
phase_name

Возвращает имя заданной фазы в виде строки с завершающим нулём.

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

const char* phase_name = phase_name(PL_phase);
mess("This is weird. (Perl phase: %s)", phase_name);
const char *const  phase_name(enum perl_phase)
Poison

PoisonWith(0xEF) для перехвата доступа к освобождённой памяти.

void  Poison(void* dest, int nitems, type)
PoisonFree

PoisonWith(0xEF) для перехвата доступа к освобождённой памяти.

void  PoisonFree(void* dest, int nitems, type)
PoisonNew

PoisonWith(0xAB) для перехвата доступа к выделенной, но не инициализированной памяти.

void  PoisonNew(void* dest, int nitems, type)
PoisonWith

Заполняет память образцом байтов (повторяющимся байтом), который, надеюсь, перехватывает попытки доступа к неинициализированной памяти.

void  PoisonWith(void* dest, int nitems, type, U8 byte)
StructCopy

Это архитектурно-независимый макрос для копирования одной структуры в другую.

void  StructCopy(type *src, type *dest, type)
sv_destroyable

Псевдофункция, которая сообщает, что объект может быть уничтожен, когда модуль совместного использования отсутствует. Она игнорирует свой аргумент SV и возвращает 'true'. Существует для предотвращения проверки указателя на функцию NULL и потому что она потенциально может выдать предупреждение при определённом уровне строгости.

bool  sv_destroyable(SV *sv)
sv_nosharing

Псевдофункция, которая "делит" SV, когда модуль совместного использования отсутствует. Или "блокирует" его. Или "разблокирует" его. Другими словами, она игнорирует свой единственный аргумент SV. Существует для предотвращения проверки указателя на функцию NULL и потому что она потенциально может выдать предупреждение при определённом уровне строгости.

void  sv_nosharing(SV *sv)

Версии

new_version

Возвращает новый объект версии на основе переданного SV:

SV *sv = new_version(SV *ver);

Не изменяет переданный ver SV. См. "upg_version", если нужно обновить SV.

SV*  new_version(SV *ver)
PERL_REVISION

DEPRECATED! Планируется удалить PERL_REVISION из будущих релизов Perl. Не используйте его в новом коде; удалите его из существующего.

Главное число версии интерпретатора Perl, который в данный момент компилируется или выполняется. Это значение 5 с 1993 по 2020 год.

Используйте макросы сравнения версий. См. "PERL_VERSION_EQ".

PERL_SUBVERSION

DEPRECATED! Планируется удалить PERL_SUBVERSION из будущих релизов Perl. Не используйте его в новом коде; удалите его из существующего.

Минорное число версии интерпретатора Perl, который в данный момент компилируется или выполняется. В стабильных выпусках это число указывает номер релиза для обновлений поддержки. В выпусках для разработки это тег, обозначающий снимок состояния на разных этапах цикла разработки.

Используйте макросы сравнения версий. См. "PERL_VERSION_EQ".

PERL_VERSION

DEPRECATED! Планируется удалить PERL_VERSION из будущих релизов Perl. Не используйте его в новом коде; удалите его из существующего.

Значение версии интерпретатора Perl, который в данный момент компилируется или выполняется. С 1993 по 2020 год оно колебалось от 0 до 33.

Используйте макросы сравнения версий. См. "PERL_VERSION_EQ".

PERL_VERSION_EQ
PERL_VERSION_NE
PERL_VERSION_LT
PERL_VERSION_LE
PERL_VERSION_GT
PERL_VERSION_GE

Возвращает значение истинности или ложности, указывая, соответствует ли текущая компилируемая версия Perl заданным отношениям с указанной версией Perl в параметрах. Например,

#if PERL_VERSION_GT(5,24,2)
  code that will only be compiled on perls after v5.24.2
#else
  fallback code
#endif

Обратите внимание, что это используется для принятия решений во время компиляции.

Вы можете использовать специальное значение '*' для последнего числа, чтобы указать ВСЕ возможные значения для него. Таким образом,

#if PERL_VERSION_EQ(5,31,'*')

означает все версии Perl в серии 5.31. И

#if PERL_VERSION_NE(5,24,'*')

означает все версии Perl, КРОМЕ версии 5.24. И

#if PERL_VERSION_LE(5,9,'*')

по существу эквивалентно

#if PERL_VERSION_LT(5,10,0)

Это означает, что вам не нужно так много думать при переходе с устаревшего PERL_VERSION на использование этой макрокоманды:

#if PERL_VERSION <= 9

превращается в

#if PERL_VERSION_LE(5,9,'*')
bool  PERL_VERSION_EQ(const U8 major, const U8 minor,
                      const U8 patch)
prescan_version

Проверяет, может ли заданная строка быть проанализирована как объект версии, но фактически не выполняет анализ. Может использовать строгие или нестрогие правила проверки. Можно по желанию установить несколько переменных подсказок для того, чтобы сэкономить время коду анализа при разбиении на токены.

const char*  prescan_version(const char *s, bool strict,
                             const char** errstr, bool *sqv,
                             int *ssaw_decimal, int *swidth,
                             bool *salpha)
scan_version

Возвращает указатель на следующий символ после проанализированной строки версии, а также повышает переданный SV до RV.

Функция должна вызываться с уже существующим SV, как в примере

sv = newSV(0);
s = scan_version(s, SV *sv, bool qv);

Выполняет некоторую предобработку строки, чтобы убедиться, что она обладает правильными характеристиками версии. Помечает объект, если он содержит подчёркивание (что обозначает, что это предварительная версия). Логическое значение qv указывает, что версия должна интерпретироваться как имеющая несколько десятичных знаков, даже если это не так.

const char*  scan_version(const char *s, SV *rv, bool qv)
upg_version

Повышение предоставленного SV до объекта версии "in-place".

SV *sv = upg_version(SV *sv, bool qv);

Возвращает указатель на обновленный SV. Установите логическое значение qv, если вы хотите принудительно интерпретировать этот SV как "расширенную" версию.

SV*  upg_version(SV *ver, bool qv)
vcmp

Сравнение, учитывающее объекты версии. Оба операнда должны быть предварительно преобразованы в объекты версии.

int  vcmp(SV *lhv, SV *rhv)
vnormal

Принимает объект версии и возвращает нормализованное строковое представление. Вызов выглядит так:

sv = vnormal(rv);

ПРИМЕЧАНИЕ: Вы можете передать либо сам объект, либо SV, содержащийся в RV.

Возвращаемый SV имеет счётчик ссылок 1.

SV*  vnormal(SV *vs)
vnumify

Принимает объект версии и возвращает нормализованное представление с плавающей точкой. Вызов выглядит так:

sv = vnumify(rv);

ПРИМЕЧАНИЕ: Вы можете передать либо сам объект, либо SV, содержащийся в RV.

Возвращаемый SV имеет счётчик ссылок 1.

SV*  vnumify(SV *vs)
vstringify

Для сохранения максимальной совместимости с более ранними версиями Perl, эта функция вернёт либо представление с плавающей точкой, либо обозначение с несколькими точками, в зависимости от того, содержала ли исходная версия 1 или более точек соответственно.

Возвращаемый SV имеет счётчик ссылок 1.

SV*  vstringify(SV *vs)
vverify

Проверяет, что SV содержит действительную внутреннюю структуру для объекта версии. Ему может быть передан либо сам объект версии (RV), либо сам хэш (HV). Если структура действительна, он возвращает HV. Если структура недействительна, он возвращает NULL.

SV *hv = vverify(sv);

Обратите внимание, что он проверяет только минимальную структуру (чтобы не путаться с производными классами, которые могут содержать дополнительные записи в хэше):

  • SV является HV или ссылкой на HV

  • Хэш содержит ключ "version"

  • Ключ "version" имеет ссылку на AV в качестве значения

SV*  vverify(SV *vs)

Предупреждения и Выход

Во всех этих вызовах параметры U32 wn являются константами категорий предупреждений. Вы можете увидеть доступные в настоящее время категории в "Иерархия категорий" в предупреждениях, просто напишите все буквы в именах заглавными и добавьте префикс WARN_. Например, категория void в программе Perl становится WARN_VOID при использовании в XS-коде и передаче в один из вызовов ниже.

ckWARN
ckWARN2
ckWARN3
ckWARN4

Возвращают логическое значение, указывающее, включены ли предупреждения для любой из категорий предупреждений в параметрах: w, w1, ....

Если какая-либо из категорий по умолчанию включена, даже если она не находится в области действия use warnings, используйте макросы "ckWARN_d".

Категории должны быть полностью независимыми; одна не может быть подклассом другой.

bool  ckWARN (U32 w)
bool  ckWARN2(U32 w1, U32 w2)
bool  ckWARN3(U32 w1, U32 w2, U32 w3)
bool  ckWARN4(U32 w1, U32 w2, U32 w3, U32 w4)
ckWARN_d
ckWARN2_d
ckWARN3_d
ckWARN4_d

Как и "ckWARN", но для использования только тогда, когда категория(и) предупреждений по умолчанию включена, даже если она не находится в области действия use warnings.

bool  ckWARN_d (U32 w)
bool  ckWARN2_d(U32 w1, U32 w2)
bool  ckWARN3_d(U32 w1, U32 w2, U32 w3)
bool  ckWARN4_d(U32 w1, U32 w2, U32 w3, U32 w4)
ck_warner
ck_warner_d

Если ни одна из категорий предупреждений, заданных в err, не включена, ничего не делайте; в противном случае вызовите "warner" или "warner_nocontext" с переданными параметрами.

err должно быть одной из макрокоманд "packWARN", packWARN2, packWARN3, packWARN4 с соответствующим количеством категорий предупреждений.

Два варианта отличаются только тем, что ck_warner_d следует использовать, если предупреждения для какой-либо из категорий включены по умолчанию.

ПРИМЕЧАНИЕ: ck_warner должен быть явно вызван как Perl_ck_warner с параметром aTHX_.

ПРИМЕЧАНИЕ: ck_warner_d должен быть явно вызван как Perl_ck_warner_d с параметром aTHX_.

void  Perl_ck_warner(pTHX_ U32 err, const char* pat, ...)
CLEAR_ERRSV

Очистить содержимое $@, установив его в пустую строку.

Это заменяет любой только для чтения SV свежим SV и удаляет всю магию.

void  CLEAR_ERRSV()
croak
croak_nocontext

Это XS-интерфейсы к функции Perl die.

Они принимают шаблон форматирования в стиле sprintf и список аргументов, которые используются для создания строкового сообщения. Если сообщение не заканчивается символом новой строки, то оно будет дополнено некоторым указанием текущего местоположения в коде, как описано для "mess_sv".

Сообщение об ошибке будет использоваться как исключение, по умолчанию возвращая управление к ближайшему окружающему eval, но может быть изменено обработчиком $SIG{__DIE__}. В любом случае, эти функции croak никогда не возвращаются нормально.

По историческим причинам, если pat равно null, то содержимое ERRSV ($@) будет использоваться как сообщение об ошибке или объект вместо построения сообщения об ошибке из аргументов. Если вы хотите выбросить нестроковый объект или самостоятельно построить сообщение об ошибке в SV, лучше использовать функцию "croak_sv", которая не включает в себя уничтожение ERRSV.

Два варианта отличаются только тем, что croak_nocontext не принимает параметр контекста потока (aTHX). Обычно он предпочтительнее, так как занимает меньше байтов кода, чем просто Perl_croak, и время редко является критическим ресурсом, когда вы собираетесь выбросить исключение.

ПРИМЕЧАНИЕ: croak должен быть явно вызван как Perl_croak с параметром aTHX_.

void  Perl_croak     (pTHX_ const char* pat, ...)
void  croak_nocontext(const char* pat, ...)
croak_no_modify

Это обобщает распространённую причину выхода, создавая более компактный код объекта, чем использование универсального Perl_croak. Он точно эквивалентен Perl_croak(aTHX_ "%s", PL_no_modify) (что расширяется до чего-то вроде "Попытка модификации значения только для чтения").

Меньше кода в пути обработки исключений уменьшает давление на кэш процессора.

void  croak_no_modify()
croak_sv

Это XS-интерфейс к функции Perl die.

baseex — это сообщение об ошибке или объект. Если это ссылка, она будет использоваться как есть. В противном случае она используется как строка, и если она не заканчивается символом новой строки, то она будет дополнена некоторым указанием текущего местоположения в коде, как описано для "mess_sv".

Сообщение об ошибке или объект будет использоваться как исключение, по умолчанию возвращая управление к ближайшему окружающему eval, но может быть изменено обработчиком $SIG{__DIE__}. В любом случае, функция croak_sv никогда не возвращается нормально.

Для выхода со строковым сообщением функция "croak" может быть более удобной.

void  croak_sv(SV *baseex)
die
die_nocontext

Они ведут себя так же, как "croak", за исключением типа возвращаемого значения. Их следует использовать только там, где требуется тип возвращаемого значения OP *. Они никогда фактически не возвращаются.

Два варианта отличаются только тем, что die_nocontext не принимает параметр контекста потока (aTHX), поэтому используется в ситуациях, когда вызывающий метод не имеет контекста потока.

ПРИМЕЧАНИЕ: die должен быть явно вызван как Perl_die с параметром aTHX_.

OP*  Perl_die     (pTHX_ const char* pat, ...)
OP*  die_nocontext(const char* pat, ...)
die_sv

Он ведёт себя так же, как "croak_sv", за исключением типа возвращаемого значения. Его следует использовать только там, где требуется тип возвращаемого значения OP *. Функция никогда фактически не возвращается.

OP*  die_sv(SV *baseex)
ERRSV

Возвращает SV для $@, создавая его при необходимости.

SV *  ERRSV
packWARN
packWARN2
packWARN3
packWARN4

Эти макросы используются для упаковки категорий предупреждений в один U32 для передачи макросам и функциям, принимающим параметр категории предупреждений. Количество категорий для упаковки задаётся именем с соответствующим количеством параметров категории, передаваемых в качестве аргументов.

U32  packWARN (U32 w1)
U32  packWARN2(U32 w1, U32 w2)
U32  packWARN3(U32 w1, U32 w2, U32 w3)
U32  packWARN4(U32 w1, U32 w2, U32 w3, U32 w4)
SANE_ERRSV

Очистить ERRSV, чтобы безопасно его установить.

Это заменяет любой только для чтения SV свежим изменяемым копией и удаляет всю магию.

void  SANE_ERRSV()
vcroak

Это интерфейс XS для функции Perl die.

pat и args — это шаблон формата в стиле sprintf и список аргументов в капсуле. Они используются для генерации сообщения об ошибке. Если сообщение не заканчивается новой строкой, оно будет дополнено указанием текущего местоположения в коде, как описано для "mess_sv".

Сообщение об ошибке будет использоваться как исключение, по умолчанию возвращая управление к ближайшему внешнему eval, но может быть изменено обработчиком $SIG{__DIE__}. В любом случае, функция croak никогда не возвращается нормально.

По историческим причинам, если pat равно null, содержимое ERRSV ($@) будет использоваться как сообщение об ошибке или объект вместо построения сообщения об ошибке из аргументов. Если вы хотите бросить объект, не являющийся строкой, или построить сообщение об ошибке в SV самостоятельно, предпочтительнее использовать функцию "croak_sv", которая не включает в себя уничтожение ERRSV.

void  vcroak(const char* pat, va_list* args)
vwarn

Это интерфейс XS для функции Perl warn.

Это похоже на "warn", но args — это список аргументов в капсуле.

В отличие от "vcroak", pat не может быть null.

void  vwarn(const char* pat, va_list* args)
vwarner

Это похоже на "warner", но args — это список аргументов в капсуле.

void  vwarner(U32 err, const char* pat, va_list* args)
warn
warn_nocontext

Это интерфейсы XS для функции Perl warn.

Они принимают шаблон формата в стиле sprintf и список аргументов, которые используются для генерации строкового сообщения. Если сообщение не заканчивается новой строкой, оно будет дополнено указанием текущего местоположения в коде, как описано для "mess_sv".

Сообщение об ошибке или объект по умолчанию будут выведены в стандартный поток ошибок, но это может быть изменено обработчиком $SIG{__WARN__}.

В отличие от "croak", pat не может быть null.

Эти два варианта отличаются только тем, что warn_nocontext не принимает параметр контекста потока (aTHX), поэтому используется в ситуациях, когда у вызывающего объекта нет контекста потока.

ПРИМЕЧАНИЕ: warn должен быть явно вызван как Perl_warn с параметром aTHX_.

void  Perl_warn     (pTHX_ const char* pat, ...)
void  warn_nocontext(const char* pat, ...)
warner
warner_nocontext

Они выводят предупреждение указанной категории (или категорий), заданной err, используя шаблон формата в стиле sprintf pat и список аргументов.

err должен быть одним из макросов "packWARN", packWARN2, packWARN3, packWARN4 с соответствующим количеством категорий предупреждений. Если любая из указанных категорий предупреждений является критической, генерируется критическая ошибка.

В любом случае генерируется сообщение на основе шаблона и аргументов. Если сообщение не заканчивается новой строкой, оно будет дополнено указанием текущего местоположения в коде, как описано для "mess_sv".

Сообщение об ошибке или объект по умолчанию выводятся в стандартный поток ошибок, но это может быть изменено обработчиком $SIG{__WARN__}.

pat не может быть null.

Эти два варианта отличаются только тем, что warner_nocontext не принимает параметр контекста потока (aTHX), поэтому используется в ситуациях, когда у вызывающего объекта нет контекста потока.

Эти функции отличаются от функций с похожим именем "warn", так как последние предназначены для безусловного отображения предупреждения в коде XS, в то время как эти предназначены для кода, который может компилировать программу Perl, и выполняет дополнительную проверку, чтобы увидеть, должно ли предупреждение быть критическим.

ПРИМЕЧАНИЕ: warner должен быть явно вызван как Perl_warner с параметром aTHX_.

void  Perl_warner     (pTHX_ U32 err, const char* pat, ...)
void  warner_nocontext(U32 err, const char* pat, ...)
warn_sv

Это интерфейс XS для функции Perl warn.

baseex — это сообщение об ошибке или объект. Если это ссылка, она будет использована как есть. В противном случае она используется как строка, и если она не заканчивается новой строкой, она будет дополнена указанием текущего местоположения в коде, как описано для "mess_sv".

Сообщение об ошибке или объект по умолчанию выводятся в стандартный поток ошибок, но это может быть изменено обработчиком $SIG{__WARN__}.

Для вывода простого текстового сообщения можно использовать функцию "warn".

void  warn_sv(SV *baseex)

XS

xsubpp компилирует код XS в C. См. "xsubpp" в perlutil.

aMY_CXT

Описание в perlxs.

aMY_CXT_

Описание в perlxs.

_aMY_CXT

Описание в perlxs.

baseex

Переменная, устанавливаемая xsubpp, для указания смещения базового значения стека, используемая макросами ST, XSprePUSH и XSRETURN. Макрос dMARK должен быть вызван перед установкой переменной MARK.

I32  ax
CLASS

Переменная, устанавливаемая xsubpp, для обозначения имени класса для конструктора C++ XS. Это всегда char*. См. "THIS".

char*  CLASS
dAX

Устанавливает переменную ax. Обычно это происходит автоматически, когда xsubpp вызывает dXSARGS.

dAX;
dAXMARK

Устанавливает переменную ax и переменную метки стека mark. Обычно это происходит автоматически, когда xsubpp вызывает dXSARGS.

dAXMARK;
dITEMS

Устанавливает переменную items. Обычно это происходит автоматически, когда xsubpp вызывает dXSARGS.

dITEMS;
dMY_CXT

Описание в perlxs.

dMY_CXT_SV

Сейчас заполнитель, который ничего не объявляет.

dMY_CXT_SV;
dUNDERBAR

Устанавливает любые переменные, необходимые макросу UNDERBAR. Раньше он использовался для определения padoff_du, но в настоящее время он является пустой операцией. Тем не менее, настоятельно рекомендуется использовать его для обеспечения совместимости в прошлом и будущем.

dUNDERBAR;
dXSARGS

Настраивает указатели стека и маркера для XSUB, вызывая dSP и dMARK. Устанавливает переменные ax и items путем вызова dAX и dITEMS. Обычно это делается автоматически xsubpp.

dXSARGS;
dXSI32

Устанавливает переменную ix для XSUB с псевдонимами. Обычно это делается автоматически xsubpp.

dXSI32;
items

Переменная, устанавливаемая xsubpp, для указания количества элементов в стеке. См. "Variable-length Parameter Lists" в perlxs.

I32  items
ix

Переменная, устанавливаемая xsubpp, для обозначения псевдонима XSUB, используемого для вызова. См. "The ALIAS: Keyword" в perlxs.

I32  ix
MY_CXT

Описание в perlxs.

MY_CXT_CLONE

Описание в perlxs.

MY_CXT_INIT

Описание в perlxs.

pMY_CXT

Описание в perlxs.

pMY_CXT_

Описание в perlxs.

_pMY_CXT

Описание в perlxs.

RETVAL

Переменная, устанавливаемая xsubpp, для хранения значения возврата XSUB. Это всегда правильный тип для XSUB. См. "The RETVAL Variable" в perlxs.

type  RETVAL
ST

Используется для доступа к элементам стека XSUB.

SV*  ST(int ix)
START_MY_CXT

Описание в perlxs.

THIS

Переменная, устанавливаемая xsubpp, для обозначения объекта в C++ XSUB. Это всегда правильный тип для C++ объекта. См. "CLASS" и "Using XS With C++" в perlxs.

type  THIS
UNDERBAR

SV*, соответствующий переменной $_. Работает даже если в области видимости существует лексическая переменная $_.

XS

Макрос для объявления XSUB и его списка параметров C. Обрабатывается xsubpp. Это то же самое, что и использование более явного макроса XS_EXTERNAL; второй предпочтительнее.

XS_EXTERNAL

Макрос для явного объявления XSUB и его списка параметров C, экспортирующих символы.

XS_INTERNAL

Макрос для объявления XSUB и его списка параметров C без экспорта символов. Обрабатывается xsubpp и, как правило, предпочтительнее, чем ненужный экспорт символов XSUB.

XSPROTO

Макрос, используемый "XS_INTERNAL" и "XS_EXTERNAL" для объявления прототипа функции. Вам, вероятно, не следует использовать его напрямую.

Элементы без документации

Следующие функции были помечены как часть публичного API, но в настоящее время не задокументированы. Используйте их на свой страх и риск, так как интерфейсы могут быть изменены. Функции, которые не указаны в этом документе, не предназначены для публичного использования и не должны использоваться ни при каких обстоятельствах.

Если вам необходимо использовать одну из этих функций, сначала отправьте письмо по адресу perl5-porters@perl.org. Возможно, есть веская причина, по которой функция не задокументирована, и её следует исключить из этого списка; или же просто никто не удосужился её задокументировать. В последнем случае от вас попросят предоставить исправление с документацией функции. После принятия вашего исправления это будет означать, что интерфейс стабилен (если явно не указано иное) и может быть использован вами.

clone_params_del  gv_name_set      newANONSUB        save_helem
clone_params_new  hv_free_ent      newAVREF          save_helem_flags
do_close          hv_ksplit        newCVREF          save_pushi32ptr
do_open           hv_name_set      newGVREF          save_pushptr
do_openn          my_failure_exit  newHVREF          save_pushptrptr
gv_autoload_pv    newANONATTRSUB   newSVREF          start_subparse
gv_autoload_pvn   newANONHASH      save_aelem        sv_dup
gv_autoload_sv    newANONLIST      save_aelem_flags  sv_dup_inc

АВТОРЫ

До мая 1997 года этот документ поддерживал Джефф Окамото <okamoto@corp.hp.com>. Сейчас он поддерживается в рамках самого Perl.

С большой помощью и предложениями от Дина Роэриха, Малькольма Бити, Андреаса Кёнига, Пола Хадсона, Ильи Захаревича, Пола Маркесса, Нила Боуэрса, Мэтью Грина, Тима Банса, Спайдера Бордмана, Ульриха Пфайфера, Стивена МакКэмана и Гурусами Сарати.

Список API изначально составлен Дином Роэрихом <roehrich@cray.com>.

Обновлен для автоматической генерации из комментариев в исходном коде Бенджамином Штуль.

СМОТРИТЕ ТАКЖЕ

config.h, perlapio, perlcall, perlclib, perlembed, perlfilter, perlguts, perlhacktips, perlintern, perlinterp, perliol, perlmroapi, perlreapi, perlreguts, perlxs

© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.36.0/perlapi

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API