perlapi
СОДЕРЖАНИЕ
- НАЗВАНИЕ
- ОПИСАНИЕ
- Обработка AV
- Функции обратного вызова
- Приведение типов
- Изменение регистра символов
- Классификация символов
- Информация о компиляторе и препроцессоре
- Директивы компилятора
- Временные крючки области действия
- Конкурентность
- COP и хэши подсказок
- Пользовательские операторы
- Обработка CV
- Отладка
- Функции отображения
- Встраивание, потоки и клонирование интерпретатора
- Errno
- Макросы обработки исключений (простые)
- Значения конфигурации файловой системы
- Числа с плавающей точкой
- Общая настройка
- Глобальные переменные
- Обработка 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)
newAVnewAV_alloc_x-
newAV_alloc_xz -
Все эти функции создают новый AV, устанавливая счётчик ссылок в 1. Если вы также знаете начальные элементы массива, см. "
av_make".В качестве справки, массив состоит из трёх частей:
-
Структура данных, содержащая информацию о массиве в целом, такую как его размер и счётчик ссылок.
-
Массив языка C, содержащий указатели на отдельные элементы. Они обрабатываются как указатели на SV, поэтому все должны быть приводимы к типу SV*.
-
Сами отдельные элементы. Это могут быть, например, 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_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_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, который позволяет вернуть все возможные корректные результаты.) Точно так же не реализованы другие функции, которые не могут обеспечить правильные результаты для всего диапазона возможных входных данных.
toFOLDtoFOLD_AtoFOLD_uvchrtoFOLD_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)
toLOWERtoLOWER_AtoLOWER_L1toLOWER_LATIN1toLOWER_LCtoLOWER_uvchrtoLOWER_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)
toTITLEtoTITLE_AtoTITLE_uvchrtoTITLE_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)
toUPPERtoUPPER_AtoUPPER_uvchrtoUPPER_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 по усмотрению реализации и может измениться в будущих версиях.
isALPHAisALPHA_AisALPHA_L1isALPHA_uvchrisALPHA_utf8_safeisALPHA_utf8isALPHA_LCisALPHA_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)
isALPHANUMERICisALPHANUMERIC_AisALPHANUMERIC_L1isALPHANUMERIC_uvchrisALPHANUMERIC_utf8_safeisALPHANUMERIC_utf8isALPHANUMERIC_LCisALPHANUMERIC_LC_uvchrisALPHANUMERIC_LC_utf8_safeisALNUMCisALNUMC_AisALNUMC_L1isALNUMC_LC-
isALNUMC_LC_uvchr -
Возвращает булево значение, указывающее, является ли указанный символ одним из
[A-Za-z0-9], аналогичноm/[[:alnum:]]/. См. начало этого раздела для объяснения вариантов.Синоним (не рекомендуется к использованию) —
isALNUMC(где суффиксCозначает, что это соответствует определению буквенно-цифровых символов языка C). Также существуют вариантыisALNUMC_A,isALNUMC_L1isALNUMC_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)
isASCIIisASCII_AisASCII_L1isASCII_uvchrisASCII_utf8_safeisASCII_utf8isASCII_LCisASCII_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)
isBLANKisBLANK_AisBLANK_L1isBLANK_uvchrisBLANK_utf8_safeisBLANK_utf8isBLANK_LCisBLANK_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)
isCNTRLisCNTRL_AisCNTRL_L1isCNTRL_uvchrisCNTRL_utf8_safeisCNTRL_utf8isCNTRL_LCisCNTRL_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)
isDIGITisDIGIT_AisDIGIT_L1isDIGIT_uvchrisDIGIT_utf8_safeisDIGIT_utf8isDIGIT_LCisDIGIT_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)
isGRAPHisGRAPH_AisGRAPH_L1isGRAPH_uvchrisGRAPH_utf8_safeisGRAPH_utf8isGRAPH_LCisGRAPH_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)
isIDCONTisIDCONT_AisIDCONT_L1isIDCONT_uvchrisIDCONT_utf8_safeisIDCONT_utf8isIDCONT_LCisIDCONT_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)
isIDFIRSTisIDFIRST_AisIDFIRST_L1isIDFIRST_uvchrisIDFIRST_utf8_safeisIDFIRST_utf8isIDFIRST_LCisIDFIRST_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)
isLOWERisLOWER_AisLOWER_L1isLOWER_uvchrisLOWER_utf8_safeisLOWER_utf8isLOWER_LCisLOWER_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)
isOCTALisOCTAL_A-
isOCTAL_L1 -
Возвращает булево значение, указывающее, является ли указанный символ восьмеричной цифрой [0-7]. Единственные два варианта —
isOCTAL_AиisOCTAL_L1; каждый из них идентиченisOCTAL.bool isOCTAL(UV ch)
isPRINTisPRINT_AisPRINT_L1isPRINT_uvchrisPRINT_utf8_safeisPRINT_utf8isPRINT_LCisPRINT_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)
isPSXSPCisPSXSPC_AisPSXSPC_L1isPSXSPC_uvchrisPSXSPC_utf8_safeisPSXSPC_utf8isPSXSPC_LCisPSXSPC_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)
isPUNCTisPUNCT_AisPUNCT_L1isPUNCT_uvchrisPUNCT_utf8_safeisPUNCT_utf8isPUNCT_LCisPUNCT_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)
isSPACEisSPACE_AisSPACE_L1isSPACE_uvchrisSPACE_utf8_safeisSPACE_utf8isSPACE_LCisSPACE_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)
isUPPERisUPPER_AisUPPER_L1isUPPER_uvchrisUPPER_utf8_safeisUPPER_utf8isUPPER_LCisUPPER_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)
isWORDCHARisWORDCHAR_AisWORDCHAR_L1isWORDCHAR_uvchrisWORDCHAR_utf8_safeisWORDCHAR_utf8isWORDCHAR_LCisWORDCHAR_LC_uvchrisWORDCHAR_LC_utf8_safeisALNUMisALNUM_AisALNUM_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)
isXDIGITisXDIGIT_AisXDIGIT_L1isXDIGIT_uvchrisXDIGIT_utf8_safeisXDIGIT_utf8isXDIGIT_LCisXDIGIT_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для умножения целых чисел с проверкой переполнения.
-
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: не объявлять ничего.
-
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потоковойAPIAPI.
-
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 -
Возвращает имя файла, связанного с
COPc.const char * CopFILE(const COP * c)
-
CopFILEAV -
Возвращает AV, связанный с
COPc, создавая его при необходимости.AV * CopFILEAV(const COP * c)
-
CopFILEAVn -
Возвращает AV, связанный с
COPc, возвращая NULL, если его ещё нет.AV * CopFILEAVn(const COP * c)
-
CopFILEGV -
Возвращает GV, связанный с
COPc.GV * CopFILEGV(const COP * c)
-
CopFILEGV_set -
Доступно только в однопоточных Perl. Устанавливает
pvкак имя файла, связанного сCOPc.void CopFILEGV_set(COP * c, GV * gv)
-
CopFILE_set -
Устанавливает
pvкак имя файла, связанного сCOPc.void CopFILE_set(COP * c, const char * pv)
-
CopFILESV -
Возвращает SV, связанный с
COPc.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_pvncophh_delete_pvcophh_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_pvncophh_fetch_pvcophh_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_pvncophh_store_pvcophh_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_pvncop_hints_exists_pvcop_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_pvncop_hints_fetch_pvcop_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)
CopLABELCopLABEL_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 -
Возвращает номер строки в исходном коде, связанный с
COPcSTRLEN CopLINE(const COP * c)
-
CopSTASH -
Возвращает stash, связанный с
c.HV * CopSTASH(const COP * c)
-
CopSTASH_eq -
Возвращает булево значение, указывающее, является ли
hvstash, связанным с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)
-
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_cvget_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 shadowingPADOFFSET 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 levelsSVf_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 formatvoid 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.
-
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), чтобы служить в качестве кода завершения, указывающего на характер завершения инициализации. Однако это не переносимо из-за различных соглашений о кодах завершения. Сохраняется историческая ошибка: если встроенная функция Perlexitвызывается во время выполнения этой функции с типом выхода, подразумевающим нулевой код выхода в соответствии с соглашениями операционной системы хоста, то эта функция возвращает ноль вместо ненулевого значения. Эта ошибка [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файл, имя которого указано в строковом аргументе. Аналогично коду Perleval "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без закрытия базового дескриптора файла. Эта функция появилась вFreeBSD10.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'sst_ino. 1 для беззнакового, -1 для знакового.
-
ST_INO_SIZE -
Эта переменная содержит размер
struct stat'sst_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_ENDIANDOUBLE_IS_IEEE_754_32_BIT_BIG_ENDIANDOUBLE_IS_IEEE_754_64_BIT_LITTLE_ENDIANDOUBLE_IS_IEEE_754_64_BIT_BIG_ENDIANDOUBLE_IS_IEEE_754_128_BIT_LITTLE_ENDIANDOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIANDOUBLE_IS_IEEE_754_64_BIT_MIXED_ENDIAN_LE_BEDOUBLE_IS_IEEE_754_64_BIT_MIXED_ENDIAN_BE_LEDOUBLE_IS_VAX_F_FLOATDOUBLE_IS_VAX_D_FLOATDOUBLE_IS_VAX_G_FLOATDOUBLE_IS_IBM_SINGLE_32_BITDOUBLE_IS_IBM_DOUBLE_64_BITDOUBLE_IS_CRAY_SINGLE_64_BITDOUBLE_IS_UNKNOWN_FORMAT
-
DOUBLEMANTBITS -
Этот символ, если определен, указывает, сколько битов мантиссы имеется в формате с плавающей запятой двойной точности. Обратите внимание, что это обычно
DBL_MANT_DIGминус один, так как в стандартных форматах IEEE 754DBL_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. Доступна, например, в DigitalUNIX. Возвращаемые значения определены в 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.hFP_NORMAL Normalized FP_ZERO Zero FP_INFINITE Infinity FP_SUBNORMAL Denormalized FP_NAN NaN
-
HAS_FP_CLASSL -
Этот символ, если определен, указывает, что функция
fp_classlдоступна для классификации значений типа long double. Доступна, например, в DigitalUNIX. Возможные значения см. в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может включать неявный битIEEE754. Общий формат длинной двойной точности типа x86-80 не имеет неявного бита.
-
LONGDBLNANBYTES -
Если этот символ определён, это список шестнадцатеричных байтов (0xHH), отделённых запятыми, для значения "не число" (NaN) длинной двойной точности.
-
LONG_DOUBLEKIND -
LONG_DOUBLEKINDбудет одним изLONG_DOUBLE_IS_DOUBLELONG_DOUBLE_IS_IEEE_754_128_BIT_LITTLE_ENDIANLONG_DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIANLONG_DOUBLE_IS_X86_80_BIT_LITTLE_ENDIANLONG_DOUBLE_IS_X86_80_BIT_BIG_ENDIANLONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_LELONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BELONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_BELONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_LELONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LITTLE_ENDIANLONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BIG_ENDIANLONG_DOUBLE_IS_VAX_H_FLOATLONG_DOUBLE_IS_UNKNOWN_FORMAT. Он определён только если система поддерживает длинные двойные значения.
-
LONG_DOUBLESIZE -
Этот символ содержит размер длинного двойного значения, чтобы препроцессор C мог принимать решения на его основе. Определён только если система поддерживает длинные двойные значения. Обратите внимание, что это
sizeof(long double), который может включать неиспользуемые байты.
-
LONG_DOUBLE_STYLE_IEEE -
Если этот символ определён, то длинное двойное значение соответствует какому-либо из форматов
IEEE754: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-битный расширенный формат
IEEE754. Заметьте, что несмотря на "расширенный", он меньше, чем "стандартный", так как это расширение двойной точности.
-
LONG_DOUBLE_STYLE_IEEE_STD -
Если этот символ определён, то длинное двойное значение — 128-битный стандартный формат
IEEE754.
-
LONG_DOUBLE_STYLE_VAX -
Если этот символ определён, то длинное двойное значение соответствует 128-битному формату
VAXH.
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'sst_dev. 1 для беззнакового, -1 для знакового.
-
ST_DEV_SIZE -
Эта переменная содержит размер
struct stat'sst_devв байтах.
Список символов возможностей HAS_foo
Это список символов, которые не появляются в других местах этого документа и указывают, имеет ли текущая платформа определённую возможность. Все их имена начинаются с HAS_. Здесь перечислены только те символы, чья возможность напрямую выводится из имени. Все остальные имеют своё значение, расширенное в другом месте документа. Этот (относительно) компактный список, потому что мы считаем, что расширение добавит мало или не добавит ценности и займёт много места (потому что их очень много). Если вы считаете, что некоторые из них нужно расширить, отправьте письмо на адрес perl5-porters@perl.org.
Каждый символ здесь будет #defined тогда и только тогда, когда платформа обладает соответствующей возможностью. Если вам нужна более подробная информация, см. соответствующую запись в config.h. Для удобства список разделён так, что те, которые указывают на существование рекурсивной версии возможности, перечислены отдельно.
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_AVaddgv_HVaddgv_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_fetchpvgv_fetchpvngv_fetchpvn_flagsgv_fetchpvsgv_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 входногоnameSV. Единственное различие между этими двумя формами состоит в том, что "магия получения" обычно применяется к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_fullname3gv_fullname4gv_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вместо этого)
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_layersPerlIO_binmodePerlIO_canset_cntPerlIO_clearerrPerlIO_closePerlIO_debugPerlIO_eofPerlIO_errorPerlIO_exportFILEPerlIO_fast_getsPerlIO_fdopenPerlIO_filenoPerlIO_fillPerlIO_findFILEPerlIO_flushPerlIO_get_basePerlIO_get_bufsizPerlIO_getcPerlIO_get_cntPerlIO_getposPerlIO_get_ptrPerlIO_has_basePerlIO_has_cntptrPerlIO_importFILEPerlIO_openPerlIO_printfPerlIO_putcPerlIO_putsPerlIO_readPerlIO_releaseFILEPerlIO_reopenPerlIO_rewindPerlIO_seekPerlIO_set_cntPerlIO_setlinebufPerlIO_setposPerlIO_set_ptrcntPerlIO_stderrPerlIO_stdinPerlIO_stdoutPerlIO_stdoutfPerlIO_tellPerlIO_ungetcPerlIO_unreadPerlIO_vprintfPerlIO_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_APPENDPERLIO_F_CANREADPERLIO_F_CANWRITEPERLIO_F_CRLFPERLIO_F_EOFPERLIO_F_ERRORPERLIO_F_FASTGETSPERLIO_F_LINEBUFPERLIO_F_OPENPERLIO_F_RDBUFPERLIO_F_TEMPPERLIO_F_TRUNCATEPERLIO_F_UNBUFPERLIO_F_UTF8PERLIO_F_WRBUF-
Описано в perliol.
PERLIO_K_BUFFEREDPERLIO_K_CANCRLFPERLIO_K_FASTGETSPERLIO_K_MULTIARGPERLIO_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.
I8I16I32I64IV-
Описано в perlguts.
-
I32SIZE -
Этот символ содержит
sizeof(I32).
-
I32TYPE -
Этот символ определяет тип C, используемый для I32 Perl.
-
I64SIZE -
Этот символ содержит
sizeof(I64).
-
I64TYPE -
Этот символ определяет тип C, используемый для I64 Perl.
-
I16SIZE -
Этот символ содержит
sizeof(I16).
-
I16TYPE -
Этот символ определяет тип C, используемый для I16 Perl.
INT16_CINT32_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.
-
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_TPERL_INT_FAST16_TPERL_UINT_FAST8_T-
PERL_UINT_FAST16_T -
Эти значения эквивалентны соответствующим определениям типов C99 на платформах, которые их поддерживают; они равны
intиunsigned intна платформах, которые не поддерживают их, позволяя использовать эту функцию C99 в переносимом коде.
PERL_INT_MAXPERL_INT_MINPERL_LONG_MAXPERL_LONG_MINPERL_SHORT_MAXPERL_SHORT_MINPERL_UCHAR_MAXPERL_UCHAR_MINPERL_UINT_MAXPERL_UINT_MINPERL_ULONG_MAXPERL_ULONG_MINPERL_USHORT_MAXPERL_USHORT_MINPERL_QUAD_MAXPERL_QUAD_MINPERL_UQUAD_MAX-
PERL_UQUAD_MIN -
Эти значения представляют наибольшее и наименьшее число, представимые на текущей платформе в переменных соответствующих типов.
Для знаковых типов наименьшее представимое число — это самое отрицательное число, наиболее удалённое от нуля.
Для компиляторов C99 и более поздних версий эти значения соответствуют значениям, таким как
INT_MAX, доступным в коде C. Но эти константы, предоставленные Perl, позволяют коду, скомпилированному на более ранних компиляторах, иметь доступ к тем же константам в переносимом виде.
-
SHORTSIZE -
Эта переменная содержит значение
sizeof(short), чтобы препроцессор C мог принимать решения на основе этого значения.
U8U16U32U64UV-
Описание в 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_CUINT32_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, если pragmause utf8активен. Однако во время выполнения строки eval скаляр может иметь флагSvUTF8включенным, и в этом случае его байты должны интерпретироваться как UTF-8, если pragmause 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доступна и содержит дополнительные члены, добавленные вPOSIX1003.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_langinfoAPI вместо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_COPYMGf_DUPMGf_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из SVsv. См. "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из SVsv. См. "sv_magic".void mg_free_type(SV* sv, int how)
-
mg_get -
Выполнить магию перед получением значения из SV. Тип SV должен быть >=
SVt_PVMG. См."sv_magic".int mg_get(SV* sv)
-
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_arylenPERL_MAGIC_arylen_pPERL_MAGIC_backrefPERL_MAGIC_bmPERL_MAGIC_checkcallPERL_MAGIC_collxfrmPERL_MAGIC_dbfilePERL_MAGIC_dblinePERL_MAGIC_debugvarPERL_MAGIC_defelemPERL_MAGIC_envPERL_MAGIC_envelemPERL_MAGIC_extPERL_MAGIC_fmPERL_MAGIC_hintsPERL_MAGIC_hintselemPERL_MAGIC_isaPERL_MAGIC_isaelemPERL_MAGIC_lvrefPERL_MAGIC_nkeysPERL_MAGIC_nonelemPERL_MAGIC_overload_tablePERL_MAGIC_posPERL_MAGIC_qrPERL_MAGIC_regdataPERL_MAGIC_regdatumPERL_MAGIC_regex_globalPERL_MAGIC_rhashPERL_MAGIC_sigPERL_MAGIC_sigelemPERL_MAGIC_substrPERL_MAGIC_svPERL_MAGIC_symtabPERL_MAGIC_taintPERL_MAGIC_tiedPERL_MAGIC_tiedelemPERL_MAGIC_tiedscalarPERL_MAGIC_utf8PERL_MAGIC_uvarPERL_MAGIC_uvar_elemPERL_MAGIC_vecPERL_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, которая рассматривается этой функцией (передавая не-NULLendptr), и если начальные байты этой части образуют корректное значение, она вернёт 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, всегда принимает точкой символ разделителя, но также и символ разделителя текущей локали, если и только если вызвана из области лексического действия инструкции Perluse 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_acosPerl_asinPerl_atanPerl_atan2Perl_ceilPerl_cosPerl_coshPerl_expPerl_floorPerl_fmodPerl_frexpPerl_isfinitePerl_isinfPerl_isnanPerl_ldexpPerl_logPerl_log10Perl_modfPerl_powPerl_sinPerl_sinhPerl_sqrtPerl_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. Мы не должны просто переименовывать#definesignbitв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)
-
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инициализированным значениемauxOP* 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_BASEOPOA_BINOPOA_COPOA_LISTOPOA_LOGOPOA_PADOPOA_PMOPOA_PVOP_OR_SVOPOA_SVOPOA_UNOPOA_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)
-
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 subPADLIST* 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 использует реальные
ANSIC прототипы вместо функций в стиле K&R без информации о параметрах. В то время какANSIC прототипы поддерживаются в C++, функции в стиле K&R приведут к ошибкам.
-
GDBM_NDBM_H_USES_PROTOTYPES -
Если этот символ определён, это означает, что <gdbm-ndbm.h> использует реальные
ANSIC прототипы вместо функций в стиле K&R без информации о параметрах. В то время какANSIC прототипы поддерживаются в 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);
-
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_tshmat(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 использует реальные
ANSIC прототипы вместо функций в стиле K&R без информации о параметрах. Хотя прототипыANSIC поддерживаются в 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_STRREXEC_COPY_SKIP_PREREXEC_COPY_SKIP_POST-
Описание в perlreapi.
RXapif_CLEARRXapif_DELETERXapif_EXISTSRXapif_FETCHRXapif_FIRSTKEYRXapif_NEXTKEYRXapif_SCALARRXapif_STORERXapif_ALLRXapif_ONERXapif_REGNAMERXapif_REGNAMESRXapif_REGNAMES_COUNT-
Описание в perlreapi.
RX_BUFF_IDX_CARET_FULLMATCHRX_BUFF_IDX_CARET_POSTMATCHRX_BUFF_IDX_CARET_PREMATCHRX_BUFF_IDX_FULLMATCHRX_BUFF_IDX_POSTMATCHRX_BUFF_IDX_PREMATCH-
Описание в perlreapi.
RXf_PMf_MULTILINERXf_PMf_SINGLELINERXf_PMf_FOLDRXf_PMf_EXTENDEDRXf_PMf_KEEPCOPY-
Описание в perlreapi.
RXf_SPLITRXf_SKIPWHITERXf_START_ONLYRXf_WHITERXf_NULLRXf_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.
whichsigwhichsig_pvwhichsig_pvn-
whichsig_sv -
Все они преобразуют имя сигнала в соответствующий номер сигнала; возвращают -1, если соответствующий номер не найден.
Они отличаются только источником имени сигнала:
whichsig_pvберёт имя из строки, заканчивающейсяNUL, начиная сsig.whichsigпросто другое написание, синонимwhichsig_pv.whichsig_pvnберёт имя из строки, начиная сsig, длинойlenбайт.whichsig_svберёт имя из PV, хранящегося в SVsigsv.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-бинарника.
-
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* используется для semctlIPC_STAT.
-
USE_SEMCTL_SEMUN -
Если этот символ определён, это указывает, что
union semunиспользуется для semctlIPC_STAT.
-
USE_SITECUSTOMIZE -
Если этот символ определён, это указывает, что должен использоваться sitecustomize.
-
USE_SOCKS -
Если этот символ определён, это указывает, что Perl должен быть скомпилирован с использованием socks.
-
USE_STAT_BLOCKS -
Этот символ определён, если в структуре stat этой системы объявлены
st_blksizeиst_blocks.
-
USE_STDIO_BASE -
Этот символ определён, если поле
_base(или аналогичное) структуры stdioFILEможет быть использовано для доступа к буферу stdio для дескриптора файла. Если он определён, тогда макросFILE_base(fp)также будет определён и должен использоваться для доступа к этому полю. Также макросFILE_bufsiz(fp)будет определён и должен использоваться для определения количества байт в буфере.USE_STDIO_BASEникогда не будет определён, еслиUSE_STDIO_PTRне определён.
-
USE_STDIO_PTR -
Этот символ определён, если поля
_ptrи_cnt(или аналогичные) структуры stdioFILEмогут быть использованы для доступа к буферу 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, указывающий длину структуры.
-
HAS_SOCKADDR_STORAGE -
Этот символ, если определён, указывает на доступность
struct sockaddr_storage;
-
HAS_SOCKATMARK -
Этот символ, если определён, указывает, что процедура
sockatmarkдоступна для проверки, находится ли сокет в режиме внедиапазонной метки.
-
HAS_SOCKET -
Этот символ, если определён, указывает, что интерфейс
BSDsocketподдерживается.
-
HAS_SOCKETPAIR -
Этот символ, если определён, указывает, что вызов
BSDsocketpair()поддерживается.
-
HAS_SOCKS5_INIT -
Этот символ, если определён, указывает, что процедура
socks5_initдоступна для инициализации протоколаSOCKS5.
-
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;
SSNEWSSNEWaSSNEWt-
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\\\\0char* 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")
-
Версия
savepv(), которая выделяет дублирующую строку в памяти, совместно используемой между потоками.char* savesharedpv(const char* pv)
-
Версия
savepvn(), которая выделяет дублирующую строку в памяти, совместно используемой между потоками. (С конкретным отличием, что указательNULLнеприемлем.)char* savesharedpvn(const char *const pv, const STRLEN len)
-
Версия
savepvs(), которая выделяет дублирующую строку в памяти, совместно используемой между потоками.char* savesharedpvs("literal string")
-
Версия
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".
-
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 -
Возвращает логическое значение, указывающее, является ли
svGV с указателем на GP (указатель на типглоб).bool isGV_with_GP(SV * sv)
-
looks_like_number -
Проверяет, выглядит ли содержимое SV как число (или является числом).
InfиInfinityобрабатываются как числа (при этом предупреждение о нечисловом значении не выдаётся), даже если вашatof()их не понимает. Магия получения игнорируется.I32 looks_like_number(SV *const sv)
MUTABLE_PTRMUTABLE_AVMUTABLE_CVMUTABLE_GVMUTABLE_HVMUTABLE_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 warnMUTABLE_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()заменяет более старую APINEWSV(), и опускает первый параметр 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)
-
Создаёт новый 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)
-
Подобно
newSVpvn_share, но принимает строку, завершённую символомNUL, вместо пары «строка/длина».SV* newSVpv_share(const char* s, U32 hash)
-
Подобно
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)
newSVsvnewSVsv_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_catpvsv_catpv_flagssv_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)
sv_catpvfsv_catpvf_nocontextsv_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_catpvnsv_catpvn_flagssv_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_catsvsv_catsv_flagssv_catsv_mg-
sv_catsv_nomg -
Эти функции конкатенируют строку из SV
sstrв конец строки в SVdsv. Если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_copypvsv_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)
-
Возвращает булево значение, указывающее, является ли SV скаляром общего ключа хэша копирования при записи.
bool SvIsCOW_shared_hash(SV* sv)
-
sv_isobject -
Возвращает булево значение, указывающее, является ли SV RV, указывающим на благословлённый объект. Если SV не является RV или объект не благословлён, то это вернёт false.
int sv_isobject(SV* sv)
SvIVSvIVx-
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.Для добавления магии к
SvREADONLYSV и добавления нескольких экземпляров той же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не допускает. В частности, вы можете добавлять магию кSvREADONLYSV и добавлять несколько экземпляров одной и той же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)
SvNVSvNVx-
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)
SvPVSvPVxSvPV_nomgSvPV_nolenSvPVx_nolenSvPV_nomg_nolenSvPV_mutableSvPV_constSvPVx_constSvPV_nolen_constSvPVx_nolen_constSvPV_nomg_constSvPV_nomg_const_nolenSvPV_flagsSvPV_flags_constSvPV_flags_mutableSvPVbyteSvPVbyte_nomgSvPVbyte_nolenSvPVbytex_nolenSvPVbytexSvPVbyte_or_nullSvPVbyte_or_null_nomgSvPVutf8SvPVutf8xSvPVutf8_nomgSvPVutf8_nolenSvPVutf8_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_forceSvPV_force_nolenSvPVx_forceSvPV_force_nomgSvPV_force_nomg_nolenSvPV_force_mutableSvPV_force_flagsSvPV_force_flags_nolenSvPV_force_flags_mutableSvPVbyte_forceSvPVbytex_forceSvPVutf8_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, выделенную Perlval. См. также"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)
SvPVXSvPVXxSvPVX_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более одного раза.Возвращает булево значение, указывающее, содержит ли
svPV, который считается ИСТИННЫМ. 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_incSvREFCNT_inc_NNSvREFCNT_inc_voidSvREFCNT_inc_void_NNSvREFCNT_inc_simpleSvREFCNT_inc_simple_NNSvREFCNT_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 -
Базовая реализация функции
resetPerl. Обратите внимание, что функция уровня 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; придать целевому SVPERL_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_setpvsv_setpv_mgsv_setpvnsv_setpvn_freshsv_setpvn_mgsv_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_setpvfsv_setpvf_nocontextsv_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)
SvSetSVSvSetMagicSVSvSetSV_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_setsvsv_setsv_flagssv_setsv_mg-
sv_setsv_nomg -
Эти функции копируют содержимое исходного SV
ssvв целевой SVdsv.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)
SvTRUESvTRUExSvTRUE_nomgSvTRUE_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_usepvnsv_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_downgradesv_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_upgradesv_utf8_upgrade_nomgsv_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)
SvUVSvUVx-
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)
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_thandler(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-8spv, длиной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, PVssvпредполагается октетами в этом кодировании, и декодирование входных данных начинается с позиции, на которую указывает(PV + *offset).dsvбудет конкатенирован с декодированной UTF-8 строкой изssv. Декодирование прекратится, когда в выходных данных декодирования появится строкаtstrили входные данные закончатся в PVssv. Значение, на которое указывает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, при входе PVsvпредполагается октетами в этом кодировании, и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. Чтобы разграничить, при возврате нуля, проверьте, равен ли первый байтs0. Если да, вход был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. В сборках отладки это выражение asserts <= 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_EQPERL_VERSION_NEPERL_VERSION_LTPERL_VERSION_LEPERL_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-коде и передаче в один из вызовов ниже.
ckWARNckWARN2ckWARN3-
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_dckWARN2_dckWARN3_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
packWARNpackWARN2packWARN3-
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, используя шаблон формата в стиле sprintfpatи список аргументов.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