perlapi
СОДЕРЖАНИЕ
- НАЗВАНИЕ
- ОПИСАНИЕ
- Функции манипулирования массивами
- Функции обратного вызова
- Изменение регистра символов
- Классификация символов
- Клонирование интерпретатора
- Временные крючки области видимости
- Хеши подсказок COP
- Чтение подсказок COP
- Пользовательские операторы
- Функции манипулирования CV
- Переменные и внутренние функции xsubpp
- Средства отладки
- Функции отображения и вывода
- Функции встраивания
- Макросы обработки исключений (простые)
- Функции в файле pp_sort.c
- Функции в файле scope.c
- Функции в файле vutil.c
- "Gimme" Значения
- Глобальные переменные
- Функции GV
- Полезные значения
- Функции манипулирования хешами
- Манипулирование крючками
- Интерфейс лексического анализатора
- Функции и макросы, связанные с локалью
- Магические функции
- Управление памятью
- Разнообразные функции
- Функции MRO
- Функции Multicall
- Числовые функции
- Функции устаревшей обратной совместимости
- Построение Optree
- Функции манипулирования Optree
- Упаковка и распаковка
- Структуры данных Pad
- Переменные на интерпретатор
- Функции REGEXP
- Макросы манипулирования стеком
- Выделение памяти для SV-тела
- Флаги SV
- Функции манипулирования SV
- Поддержка Unicode
- Переменные, созданные xsubpp и внутренними функциями xsubpp
- Предупреждения и завершение работы
- Недокументированные функции
- АВТОРЫ
- СМОТРИТЕ ТАКЖЕ
НАЗВАНИЕ
perlapi - автоматически сгенерированная документация для общедоступного API Perl
ОПИСАНИЕ
Этот файл содержит документацию для общедоступного API Perl, сгенерированную embed.pl, в частности, список функций, макросов, флагов и переменных, которые могут использоваться авторами расширений. В конце приведен список функций, которые еще не были задокументированы. Интерфейсы этих функций могут быть изменены без предварительного уведомления. Все, что не указано здесь, не входит в состав общедоступного API и не должно использоваться авторами расширений. По этим причинам следует избегать слепого использования функций, перечисленных в proto.h, при написании расширений.
В Perl, в отличие от C, строка символов может, как правило, содержать встроенные NUL символы. Иногда в документации строка Perl называется «буфером», чтобы отличить ее от строки C, но иногда они обе называются просто строками.
Обратите внимание, что все глобальные переменные API Perl должны быть указаны с префиксом PL_. Снова, те, что не указаны здесь, не должны использоваться авторами расширений и могут быть изменены или удалены без предварительного уведомления; то же самое относится и к макросам. Некоторые макросы предоставляются для совместимости со старыми, незамысловатыми именами, но эта поддержка может быть отключена в будущих выпусках.
Perl изначально был разработан для работы только с US-ASCII (то есть символами, чьи порядковые номера находятся в диапазоне от 0 до 127). И документация, и комментарии могут по-прежнему использовать термин ASCII, когда на самом деле иногда подразумевается весь диапазон от 0 до 255.
Символы с кодами ниже 256, отличные от ASCII, могут иметь различные значения в зависимости от различных факторов. (См., в частности, perllocale.) Но обычно весь диапазон можно обозначить как ISO-8859-1. Часто термин «Latin-1» (или «Latin1») используется как эквивалент ISO-8859-1. Однако некоторые люди считают «Latin1» относящимся только к символам в диапазоне от 128 до 255 или иногда от 160 до 255. В этой документации «Latin-1» и «Latin1» используются для обозначения всех 256 символов.
Обратите внимание, что Perl может быть скомпилирован и запущен как под ASCII, так и под EBCDIC (см. perlebcdic). Большая часть документации (и даже комментарии в коде) игнорируют возможность EBCDIC. Для почти всех целей различия прозрачны. Например, в EBCDIC вместо UTF-8 используется UTF-EBCDIC для кодирования строк Unicode, и поэтому всякий раз, когда в этой документации упоминается utf8 (и варианты этого имени, включая в именах функций), это также (практически прозрачно) означает UTF-EBCDIC. Но порядковые номера символов отличаются между ASCII, EBCDIC и кодировками UTF, и строка, закодированная в UTF-EBCDIC, может занимать другое количество байтов, чем в UTF-8.
Нижеприведенный список упорядочен алфавитно, регистр не учитывается.
Функции манипулирования массивами
- av_clear
-
Освобождает все элементы массива, оставляя его пустым. Аналог XS функции
@array = (). См. также "av_undef".Обратите внимание, что действия деструктора, вызванного прямо или косвенно при освобождении элемента массива, могут привести к уменьшению счётчика ссылок самого массива (например, при удалении записи в таблице символов). Поэтому существует вероятность, что AV может быть освобождён (или даже перераспределён) по возвращении из вызова, если вы не удерживаете ссылку на него.
void av_clear(AV *av) - av_create_and_push
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Добавляет SV в конец массива, создавая массив при необходимости. Вспомогательная функция для устранения часто повторяющегося кода.
void av_create_and_push(AV **const avp, SV *const val) - av_create_and_unshift_one
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Вставляет SV в начало массива, создавая массив при необходимости. Вспомогательная функция для устранения часто повторяющегося кода.
SV** av_create_and_unshift_one(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
-
Предварительно расширяет массив.
key— индекс, до которого должен быть расширен массив.void av_extend(AV *av, SSize_t key) - av_fetch
-
Возвращает SV по указанному индексу в массиве.
key— индекс. Если lval равно true, вы гарантированно получите реальный SV (в случае, если он не был реальным ранее), который можно затем изменить. Проверьте, что возвращаемое значение не null, перед обращением к нему как кSV*.См. "Understanding the Magic of Tied Hashes and Arrays" в perlguts для получения более подробной информации о использовании этой функции с привязанными массивами.
Приблизительный эквивалент в Perl:
$myarray[$key].SV** av_fetch(AV *av, SSize_t key, I32 lval) - AvFILL
-
То же, что и
av_top_index()илиav_tindex().int 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". Обратите внимание, что, вопреки тому, что предполагает название, возвращается наибольший индекс в массиве, поэтому для получения размера массива необходимо использовать
av_len(av) + 1. Это отличается от "sv_len", которая возвращает то, что вы ожидаете.SSize_t av_len(AV *av) - av_make
-
Создаёт новый AV и заполняет его списком SV. SV копируются в массив, поэтому они могут быть освобождены после вызова
av_make. Новый 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).См. "Understanding the Magic of Tied Hashes and Arrays" в perlguts для получения более подробной информации о использовании этой функции с привязанными массивами.
SV** av_store(AV *av, SSize_t key, SV *val) - av_tindex
-
То же, что и
av_top_index().int av_tindex(AV* av) - av_top_index
-
Возвращает наибольший индекс в массиве. Количество элементов в массиве равно
av_top_index(av) + 1. Возвращает -1, если массив пуст.Эквивалент в Perl:
$#myarray.(Несколько более короткая форма:
av_tindex.)SSize_t av_top_index(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_ форма этой функции устарела.
AV* get_av(const char *name, I32 flags) - newAV
-
Создаёт новый AV. Счётчик ссылок устанавливается в 1.
Эквивалент в Perl:
my @array;.AV* newAV() - sortsv
-
Сортирует массив указателей на SV на месте с помощью заданной функции сравнения.
В настоящее время всегда используется слиянием. См.
"sortsv_flags"для более гибкой функции.void sortsv(SV** array, size_t num_elts, SVCOMPARE_t cmp)
Функции обратного вызова
- call_argv
-
Выполняет обратный вызов указанной именованной и пакетной подпрограмме Perl с
argv(массивом строк, завершающимсяNULL) в качестве аргументов. См. perlcall.Приблизительный эквивалент в Perl:
&{"$sub_name"}(@$argv).ПРИМЕЧАНИЕ: форма функции perl_ устарела.
I32 call_argv(const char* sub_name, I32 flags, char** argv) - call_method
-
Выполняет обратный вызов указанному методу Perl. Благословенный объект должен находиться в стеке. См. perlcall.
ПРИМЕЧАНИЕ: форма функции perl_ устарела.
I32 call_method(const char* methname, I32 flags) - call_pv
-
Выполняет обратный вызов указанной подпрограмме Perl. См. perlcall.
ПРИМЕЧАНИЕ: форма функции perl_ устарела.
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_ устарела.
I32 call_sv(SV* sv, volatile I32 flags) - ENTER
-
Открывающая скобка обратного вызова. См.
"LEAVE"и perlcall.ENTER; - ENTER_with_name(name)
-
То же, что и
"ENTER", но при включённом отладке также связывает заданную строковую литерал с новым объёмом.ENTER_with_name(name); - eval_pv
-
Инструктирует Perl выполнить данную строку в скалярном контексте и вернуть результат в виде SV*.
ПРИМЕЧАНИЕ: форма функции perl_ устарела.
SV* eval_pv(const char* p, I32 croak_on_error) - eval_sv
-
Инструктирует Perl выполнить строку в SV. Поддерживает те же флаги, что и
call_sv, за исключениемG_EVAL. См. perlcall.ПРИМЕЧАНИЕ: форма функции perl_ устарела.
I32 eval_sv(SV* sv, I32 flags) - FREETMPS
-
Закрывающая скобка для временных данных в обратном вызове. См.
"SAVETMPS"и perlcall.FREETMPS; - LEAVE
-
Закрывающая скобка обратного вызова. См.
"ENTER"и perlcall.LEAVE; - LEAVE_with_name(name)
-
То же, что и
"LEAVE", но при включённой отладке сначала проверяет, что область имеет заданное имя.nameдолжна быть строковой литерал.LEAVE_with_name(name); - SAVETMPS
-
Открывающая скобка для временных данных в обратном вызове. См.
"FREETMPS"и perlcall.SAVETMPS;
Изменение регистра символов
Perl использует "полные" сопоставления регистров Unicode. Это означает, что преобразование одного символа в другой регистр может привести к последовательности более чем одного символа. Например, заглавная буква символа ß (маленькая латинская буква с острым) — это последовательность из двух символов SS. Это создаёт некоторые сложности. Строчные буквы всех символов в диапазоне 0..255 — это один символ, и поэтому "toLOWER_L1" предоставляется. Но toUPPER_L1 не может существовать, так как не смог бы вернуть корректный результат для всех допустимых входных данных. Вместо этого "toUPPER_uvchr" имеет API, которое позволяет возвращать все возможные корректные результаты.) Точно так же здесь не реализована ни одна другая функция, которая бы была ограничена невозможностью возвращать корректные результаты для всего диапазона возможных входных данных.
- toFOLD
-
Преобразует указанный символ в регистр «сложенный». Если входной символ не является заглавной буквой ASCII, возвращается сам входной символ. Вариант
toFOLD_Aэквивалентен. (Нет эквивалентаto_FOLD_L1для всего диапазона Latin1, так как требуется полная общность "toFOLD_uvchr".)U8 toFOLD(U8 ch) - toFOLD_utf8
-
Это похоже на
"toFOLD_utf8_safe", но не имеет параметраe. Таким образом, функция не может проверить, не выходит ли она за пределы строки. Начиная с Perl v5.30, она будет принимать параметрe, став синонимом дляtoFOLD_utf8_safe. В этот момент каждый использующий её программу придётся изменить, чтобы она успешно компилировалась. Пока что первый вызовtoFOLD_utf8из каждой точки вызова в программе будет генерировать предупреждение об устаревании, включённое по умолчанию. Вы можете сейчас переписать свою программу для использованияtoFOLD_utf8_safe, избежать предупреждений и получить дополнительную защиту или подождать до v5.30, когда вам придётся добавить параметрe.UV toFOLD_utf8(U8* p, U8* s, STRLEN* lenp) - toFOLD_utf8_safe
-
Преобразует первый символ UTF-8 в последовательности, начинающейся с
pи не выходящей за пределыe - 1, в его «сложенный» вариант и сохраняет его в UTF-8 вs, а его длину в байтах вlenp. Обратите внимание, что буфер, на который указываетs, должен иметь длину не менееUTF8_MAXBYTES_CASE+1байт, так как «сложенный» вариант может быть длиннее исходного символа.Возвращается первый код символа в «сложенном» варианте (но, как объясняется в начале этого раздела на этой странице, может быть и больше).
Суффикс
_safeв имени функции указывает на то, что она не будет пытаться читать за пределамиe - 1, при условии, что ограничениеs < eвыполняется (это утверждается в-DDEBUGGINGсборках). Если UTF-8 для входного символа каким-то образом некорректен, программа может аварийно завершиться или функция может вернуть ЗАМЕЩАЮЩИЙ СИМВОЛ по усмотрению реализации, и это может измениться в будущих выпусках.UV toFOLD_utf8_safe(U8* p, U8* e, U8* s, STRLEN* lenp) - toFOLD_uvchr
-
Преобразует код символа
cpв его «сложенный» вариант и сохраняет его в UTF-8 вs, а его длину в байтах вlenp. Код символа интерпретируется как собственный, если он меньше 256; в противном случае как Unicode. Обратите внимание, что буфер, на который указываетs, должен иметь длину не менееUTF8_MAXBYTES_CASE+1байт, так как «сложенный» вариант может быть длиннее исходного символа.Возвращается первый код символа в «сложенном» варианте (но, как объясняется в начале этого раздела на этой странице, может быть и больше).
UV toFOLD_uvchr(UV cp, U8* s, STRLEN* lenp) - toLOWER
-
Преобразует указанный символ в нижний регистр. Если входной символ не является заглавной буквой ASCII, возвращается сам входной символ. Вариант
toLOWER_Aэквивалентен.U8 toLOWER(U8 ch) - toLOWER_L1
-
Преобразует указанный символ Latin1 в нижний регистр. Результаты не определены, если входной символ не умещается в один байт.
U8 toLOWER_L1(U8 ch) - toLOWER_LC
-
Преобразует указанный символ в нижний регистр, используя правила текущего локали, если возможно; в противном случае возвращает сам входной символ.
U8 toLOWER_LC(U8 ch) - toLOWER_utf8
-
Это похоже на
"toLOWER_utf8_safe", но не имеет параметраe. Таким образом, функция не может проверить, не выходит ли она за пределы строки. Начиная с Perl v5.30, она будет принимать параметрe, став синонимом дляtoLOWER_utf8_safe. В этот момент каждый использующий её программу придётся изменить, чтобы она успешно компилировалась. Пока что первый вызовtoLOWER_utf8из каждой точки вызова в программе будет генерировать предупреждение об устаревании, включённое по умолчанию. Вы можете сейчас переписать свою программу для использованияtoLOWER_utf8_safe, избежать предупреждений и получить дополнительную защиту или подождать до v5.30, когда вам придётся добавить параметрe.UV toLOWER_utf8(U8* p, U8* s, STRLEN* lenp) - toLOWER_utf8_safe
-
Преобразует первый символ UTF-8 в последовательности, начинающейся с
pи не выходящей за пределыe - 1, в его вариант нижнего регистра и сохраняет его в UTF-8 вs, а его длину в байтах вlenp. Обратите внимание, что буфер, на который указываетs, должен иметь длину не менееUTF8_MAXBYTES_CASE+1байт, так как вариант нижнего регистра может быть длиннее исходного символа.Возвращается первый код символа в варианте нижнего регистра (но, как объясняется в начале этого раздела на этой странице, может быть и больше).
Суффикс
_safeв имени функции указывает на то, что она не будет пытаться читать за пределамиe - 1, при условии, что ограничениеs < eвыполняется (это утверждается в-DDEBUGGINGсборках). Если UTF-8 для входного символа каким-то образом некорректен, программа может аварийно завершиться или функция может вернуть ЗАМЕЩАЮЩИЙ СИМВОЛ по усмотрению реализации, и это может измениться в будущих выпусках.UV toLOWER_utf8_safe(U8* p, U8* e, U8* s, STRLEN* lenp) - toLOWER_uvchr
-
Преобразует код символа
cpв его вариант нижнего регистра и сохраняет его в UTF-8 вs, а его длину в байтах вlenp. Код символа интерпретируется как собственный, если он меньше 256; в противном случае как Unicode. Обратите внимание, что буфер, на который указываетs, должен иметь длину не менееUTF8_MAXBYTES_CASE+1байт, так как вариант нижнего регистра может быть длиннее исходного символа.Возвращается первый код символа в варианте нижнего регистра (но, как объясняется в начале этого раздела на этой странице, может быть и больше).
UV toLOWER_uvchr(UV cp, U8* s, STRLEN* lenp) - toTITLE
-
Преобразует указанный символ в регистр «заголовок». Если входной символ не является строчной буквой ASCII, возвращается сам входной символ. Вариант
toTITLE_Aэквивалентен. (НетtoTITLE_L1для всего диапазона Latin1, так как требуется полная общность "toTITLE_uvchr". Регистр «заголовок» — это не понятие, используемое в обработке локали, поэтому такой функциональности нет.)U8 toTITLE(U8 ch) - toTITLE_utf8
-
Это похоже на
"toLOWER_utf8_safe", но не имеет параметраe. Таким образом, функция не может проверить, не выходит ли она за пределы строки. Начиная с Perl v5.30, она будет принимать параметрe, став синонимом дляtoTITLE_utf8_safe. В этот момент каждый использующий её программу придётся изменить, чтобы она успешно компилировалась. Пока что первый вызовtoTITLE_utf8из каждой точки вызова в программе будет генерировать предупреждение об устаревании, включённое по умолчанию. Вы можете сейчас переписать свою программу для использованияtoTITLE_utf8_safe, избежать предупреждений и получить дополнительную защиту или подождать до v5.30, когда вам придётся добавить параметрe.UV toTITLE_utf8(U8* p, U8* s, STRLEN* lenp) - toTITLE_utf8_safe
-
Преобразует первый символ UTF-8 в последовательности, начинающейся с
pи не выходящей за пределыe - 1, в его вариант «заголовок» и сохраняет его в UTF-8 вs, а его длину в байтах вlenp. Обратите внимание, что буфер, на который указываетs, должен иметь длину не менееUTF8_MAXBYTES_CASE+1байт, так как вариант «заголовок» может быть длиннее исходного символа.Возвращается первый код символа в варианте «заголовок» (но, как объясняется в начале этого раздела на этой странице, может быть и больше).
Суффикс
_safeв имени функции указывает на то, что она не будет пытаться читать за пределамиe - 1, при условии, что ограничениеs < eвыполняется (это утверждается в-DDEBUGGINGсборках). Если UTF-8 для входного символа каким-то образом некорректен, программа может аварийно завершиться или функция может вернуть ЗАМЕЩАЮЩИЙ СИМВОЛ по усмотрению реализации, и это может измениться в будущих выпусках.UV toTITLE_utf8_safe(U8* p, U8* e, U8* s, STRLEN* lenp) - toTITLE_uvchr
-
Преобразует код символа
cpв его вариант «заголовок» и сохраняет его в UTF-8 вs, а его длину в байтах вlenp. Код символа интерпретируется как собственный, если он меньше 256; в противном случае как Unicode. Обратите внимание, что буфер, на который указываетs, должен иметь длину не менееUTF8_MAXBYTES_CASE+1байт, так как вариант «заголовок» может быть длиннее исходного символа.Возвращается первый код символа в варианте «заголовок» (но, как объясняется в начале этого раздела на этой странице, может быть и больше).
UV toTITLE_uvchr(UV cp, U8* s, STRLEN* lenp) - toUPPER
-
Преобразует указанный символ в верхний регистр. Если входной символ не является строчной буквой ASCII, возвращается сам входной символ. Вариант
toUPPER_Aэквивалентен.U8 toUPPER(U8 ch) - toUPPER_utf8
-
Это похоже на
"toUPPER_utf8_safe", но не имеет параметраe. Таким образом, функция не может проверить, не выходит ли она за пределы строки. Начиная с Perl v5.30, она будет принимать параметрe, став синонимом дляtoUPPER_utf8_safe. В этот момент каждый использующий её программу придётся изменить, чтобы она успешно компилировалась. Пока что первый вызовtoUPPER_utf8из каждой точки вызова в программе будет генерировать предупреждение об устаревании, включённое по умолчанию. Вы можете сейчас переписать свою программу для использованияtoUPPER_utf8_safe, избежать предупреждений и получить дополнительную защиту или подождать до v5.30, когда вам придётся добавить параметрe.UV toUPPER_utf8(U8* p, U8* s, STRLEN* lenp) - toUPPER_utf8_safe
-
Преобразует первый символ, закодированный в UTF-8, в последовательности, начинающейся с
pи не выходящей за пределыe - 1, в его заглавную версию и сохраняет его в UTF-8 вs, а его длину в байтах вlenp. Обратите внимание, что буфер, на который указываетs, должен быть не менееUTF8_MAXBYTES_CASE+1байтов, так как заглавная версия может быть длиннее исходного символа.Возвращается первый код символа заглавной версии (но обратите внимание, как объяснено в начале этого раздела в верхней части этого раздела, что может быть больше символов).
Суффикс
_safeв имени функции указывает, что она не будет пытаться читать за пределамиe - 1, при условии, что ограничениеs < eверно (это утверждается для-DDEBUGGINGбилдов). Если UTF-8 для входного символа каким-либо образом некорректен, программа может завершиться ошибкой или функция может вернуть ЗАМЕЩАЮЩИЙ СИМВОЛ по усмотрению реализации и с возможностью изменения в будущих выпусках.UV toUPPER_utf8_safe(U8* p, U8* e, U8* s, STRLEN* lenp) - toUPPER_uvchr
-
Преобразует код символа
cpв его заглавную версию и сохраняет его в UTF-8 вs, а его длину в байтах вlenp. Код символа интерпретируется как локальный, если он меньше 256; в противном случае как Юникод. Обратите внимание, что буфер, на который указываетs, должен быть не менееUTF8_MAXBYTES_CASE+1байтов, так как заглавная версия может быть длиннее исходного символа.Возвращается первый код символа заглавной версии (но обратите внимание, как объяснено в начале этого раздела в верхней части этого раздела, что может быть больше символов.)
UV toUPPER_uvchr(UV cp, U8* s, STRLEN* lenp)
Классификация символов
Этот раздел посвящен функциям (на самом деле макросам), которые классифицируют символы по типам, таким как знаки препинания по сравнению с алфавитами и т. д. Большинство из них аналогичны классам символов регулярных выражений. (См. "POSIX Character Classes" в perlrecharclass.) Существует несколько вариантов для каждого класса. (Не все макросы имеют все варианты; каждый элемент ниже перечисляет те, которые действительны для него.) Ни один из них не зависит от use bytes, и только те, в названии которых есть LC, зависят от текущей локали.
Базовая функция, например, isALPHA(), принимает октет (либо char, либо U8) в качестве входных данных и возвращает логическое значение о том, является ли представленный им символ (или, на платформах, не поддерживающих ASCII, соответствует) ASCII-символом в указанном классе на основе платформы, Юникода и правил 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 (хотя она представляет разные символы в каждом из них).
Вариант isFOO_uvchr похож на вариант isFOO_L1, но принимает любой код UV в качестве входных данных. Если кодовая точка больше 255, правила Юникода используются для определения, входит ли она в класс символов. Например, isWORDCHAR_uvchr(0x100) возвращает TRUE, так как 0x100 — это ЗАГЛАВНАЯ ЛАТИНСКАЯ БУКВА A С ДИАРЕЗИСОМ в Юникоде и является символом слова.
Вариант isFOO_utf8_safe похож на isFOO_uvchr, но используется для строк, закодированных в UTF-8. Каждый вызов классифицирует один символ, даже если строка содержит несколько. Этот вариант принимает два параметра. Первый, p, указывает на первый байт классифицируемого символа. (Помните, что для представления символа в строках UTF-8 может потребоваться более одного байта.) Второй параметр, e, указывает на любое место в строке за первым символом, до байта за концом всей строки. Суффикс _safe в имени функции указывает, что она не будет пытаться читать за пределами e - 1, при условии, что ограничение s < e верно (это утверждается для -DDEBUGGING билдов). Если UTF-8 для входного символа каким-либо образом некорректен, программа может завершиться ошибкой или функция может вернуть FALSE по усмотрению реализации, и с возможностью изменения в будущих выпусках.
Вариант isFOO_utf8 похож на isFOO_utf8_safe, но принимает только один параметр, p, который имеет то же значение, что и соответствующий параметр в isFOO_utf8_safe. Таким образом, функция не может проверить, читает ли она за пределами строки. Начиная с Perl v5.30, она будет принимать второй параметр, став синонимом isFOO_utf8_safe. В это время все программы, использующие ее, должны быть изменены для успешной компиляции. Тем временем первый вызов во время выполнения isFOO_utf8 из каждой точки вызова в программе вызовет предупреждение о прекращении поддержки, включенное по умолчанию. Вы можете преобразовать свою программу сейчас, чтобы использовать isFOO_utf8_safe, избежать предупреждений и получить дополнительную защиту или подождать до версии v5.30, когда вам придется добавить параметр e.
Вариант 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, но определен для любого UV. Он возвращает то же самое, что и isFOO_LC, для входных кодовых точек меньше 256 и возвращает жёстко заданные, не зависящие от локали, результаты Юникода для больших.
Вариант isFOO_LC_utf8_safe похож на isFOO_LC_uvchr, но используется для строк, закодированных в UTF-8. Каждый вызов классифицирует один символ, даже если строка содержит несколько. Этот вариант принимает два параметра. Первый, p, указывает на первый байт классифицируемого символа. (Помните, что для представления символа в строках UTF-8 может потребоваться более одного байта.) Второй параметр, e, указывает на любое место в строке за первым символом, до байта за концом всей строки. Суффикс _safe в имени функции указывает, что она не будет пытаться читать за пределами e - 1, при условии, что ограничение s < e верно (это утверждается для -DDEBUGGING билдов). Если UTF-8 для входного символа каким-либо образом некорректен, программа может завершиться ошибкой или функция может вернуть FALSE по усмотрению реализации, и с возможностью изменения в будущих выпусках.
Вариант isFOO_LC_utf8 похож на isFOO_LC_utf8_safe, но принимает только один параметр, p, который имеет то же значение, что и соответствующий параметр в isFOO_LC_utf8_safe. Таким образом, функция не может проверить, читает ли она за пределами строки. Начиная с Perl v5.30, она будет принимать второй параметр, став синонимом isFOO_LC_utf8_safe. В это время все программы, использующие ее, должны быть изменены для успешной компиляции. Тем временем первый вызов во время выполнения isFOO_LC_utf8 из каждой точки вызова в программе вызовет предупреждение о прекращении поддержки, включенное по умолчанию. Вы можете преобразовать свою программу сейчас, чтобы использовать isFOO_LC_utf8_safe, избежать предупреждений и получить дополнительную защиту или подождать до версии v5.30, когда вам придется добавить параметр e.
- isALPHA
-
Возвращает логическое значение, указывающее, является ли указанный символ буквенным символом, аналогично
m/[[:alpha:]]/. См. начало этого раздела для объяснения вариантовisALPHA_A,isALPHA_L1,isALPHA_uvchr,isALPHA_utf8_safe,isALPHA_LC,isALPHA_LC_uvchr, иisALPHA_LC_utf8_safe.bool isALPHA(char ch) - isALPHANUMERIC
-
Возвращает логическое значение, указывающее, является ли указанный символ буквенным символом или десятичной цифрой, аналогично
m/[[:alnum:]]/. См. начало этого раздела для объяснения вариантовisALPHANUMERIC_A,isALPHANUMERIC_L1,isALPHANUMERIC_uvchr,isALPHANUMERIC_utf8_safe,isALPHANUMERIC_LC,isALPHANUMERIC_LC_uvchr, иisALPHANUMERIC_LC_utf8_safe.bool isALPHANUMERIC(char ch) - isASCII
-
Возвращает логическое значение, указывающее, является ли указанный символ одним из 128 символов набора символов ASCII, аналогично
m/[[:ascii:]]/. В не-ASCII системах возвращает TRUE, если этот символ соответствует символу ASCII. ВариантыisASCII_A()иisASCII_L1()идентичныisASCII(). См. начало этого раздела для объяснения вариантовisASCII_uvchr,isASCII_utf8_safe,isASCII_LC,isASCII_LC_uvchr, иisASCII_LC_utf8_safe. Однако обратите внимание, что некоторые платформы не имеют функцию Cisascii(). В этих случаях, варианты, названия которых содержатLC, совпадают с соответствующими вариантами без него.Также обратите внимание, что поскольку все символы ASCII являются инвариантными по UTF-8 (то есть они имеют точно такое же представление (всегда один байт), независимо от того, закодированы ли они в UTF-8 или нет),
isASCIIдаст правильные результаты, когда вызывается с любым байтом в любой строке, закодированной или нет в UTF-8. И аналогичноisASCII_utf8_safeбудет работать правильно с любой строкой, закодированной или нет в UTF-8.bool isASCII(char ch) - isBLANK
-
Возвращает логическое значение, указывающее, является ли указанный символ символом, считающимся пробелом, аналогично
m/[[:blank:]]/. См. начало этого раздела для объяснения вариантовisBLANK_A,isBLANK_L1,isBLANK_uvchr,isBLANK_utf8_safe,isBLANK_LC,isBLANK_LC_uvchr, иisBLANK_LC_utf8_safe. Однако обратите внимание, что некоторые платформы не имеют функцию Cisblank(). В этих случаях, варианты, названия которых содержатLC, совпадают с соответствующими вариантами без него.bool isBLANK(char ch) - isCNTRL
-
Возвращает логическое значение, указывающее, является ли указанный символ управляющим символом, аналогично
m/[[:cntrl:]]/. См. начало этого раздела для объяснения вариантовisCNTRL_A,isCNTRL_L1,isCNTRL_uvchr,isCNTRL_utf8_safe,isCNTRL_LC,isCNTRL_LC_uvchr, иisCNTRL_LC_utf8_safeВ системах EBCDIC почти всегда следует использовать вариантisCNTRL_L1.bool isCNTRL(char ch) - isDIGIT
-
Возвращает логическое значение, указывающее, является ли указанный символ цифрой, аналогично
m/[[:digit:]]/. ВариантыisDIGIT_AиisDIGIT_L1идентичныisDIGIT. См. начало этого раздела для объяснения вариантовisDIGIT_uvchr,isDIGIT_utf8_safe,isDIGIT_LC,isDIGIT_LC_uvchr, иisDIGIT_LC_utf8_safe.bool isDIGIT(char ch) - isGRAPH
-
Возвращает логическое значение, указывающее, является ли указанный символ графическим символом, аналогично
m/[[:graph:]]/. См. начало этого раздела для объяснения вариантовisGRAPH_A,isGRAPH_L1,isGRAPH_uvchr,isGRAPH_utf8_safe,isGRAPH_LC,isGRAPH_LC_uvchr, иisGRAPH_LC_utf8_safe.bool isGRAPH(char ch) - isIDCONT
-
Возвращает логическое значение, указывающее, может ли указанный символ быть вторым или последующим символом идентификатора. Это очень близко, но не совсем то же самое, что официальное свойство Unicode
XID_Continue. Разница в том, что это возвращает true только если входной символ также соответствует "isWORDCHAR". См. начало этого раздела для объяснения вариантовisIDCONT_A,isIDCONT_L1,isIDCONT_uvchr,isIDCONT_utf8_safe,isIDCONT_LC,isIDCONT_LC_uvchr, иisIDCONT_LC_utf8_safe.bool isIDCONT(char ch) - isIDFIRST
-
Возвращает логическое значение, указывающее, может ли указанный символ быть первым символом идентификатора. Это очень близко, но не совсем то же самое, что официальное свойство Unicode
XID_Start. Разница в том, что это возвращает true только если входной символ также соответствует "isWORDCHAR". См. начало этого раздела для объяснения вариантовisIDFIRST_A,isIDFIRST_L1,isIDFIRST_uvchr,isIDFIRST_utf8_safe,isIDFIRST_LC,isIDFIRST_LC_uvchr, иisIDFIRST_LC_utf8_safe.bool isIDFIRST(char ch) - isLOWER
-
Возвращает логическое значение, указывающее, является ли указанный символ строчной буквой, аналогично
m/[[:lower:]]/. См. начало этого раздела для объяснения вариантовisLOWER_A,isLOWER_L1,isLOWER_uvchr,isLOWER_utf8_safe,isLOWER_LC,isLOWER_LC_uvchr, иisLOWER_LC_utf8_safe.bool isLOWER(char ch) - isOCTAL
-
Возвращает логическое значение, указывающее, является ли указанный символ восьмеричной цифрой [0-7]. Единственные два варианта —
isOCTAL_AиisOCTAL_L1; каждый идентиченisOCTAL.bool isOCTAL(char ch) - isPRINT
-
Возвращает логическое значение, указывающее, является ли указанный символ печатным символом, аналогично
m/[[:print:]]/. См. начало этого раздела для объяснения вариантовisPRINT_A,isPRINT_L1,isPRINT_uvchr,isPRINT_utf8_safe,isPRINT_LC,isPRINT_LC_uvchr, иisPRINT_LC_utf8_safe.bool isPRINT(char ch) - isPSXSPC
-
(сокращение от Posix Space) Начиная с версии 5.18, это идентично во всех своих формах соответствующим
isSPACE()макросам. Форматы этого макроса с учетом локали идентичны соответствующимisSPACE()формам во всех выпусках Perl. В выпусках до 5.18 не-локализованные формы отличаются отisSPACE()форм только тем, чтоisSPACE()формы не соответствуют вертикальной табуляции, аisPSXSPC()формы соответствуют. В противном случае они идентичны. Таким образом, этот макрос аналогичен тому, чтоm/[[:space:]]/соответствует в регулярном выражении. См. начало этого раздела для объяснения вариантовisPSXSPC_A,isPSXSPC_L1,isPSXSPC_uvchr,isPSXSPC_utf8_safe,isPSXSPC_LC,isPSXSPC_LC_uvchr, иisPSXSPC_LC_utf8_safe.bool isPSXSPC(char ch) - isPUNCT
-
Возвращает логическое значение, указывающее, является ли указанный символ пунктуационным символом, аналогично
m/[[:punct:]]/. Обратите внимание, что определение пунктуации не такое прямое, как хотелось бы. См. "POSIX Character Classes" in perlrecharclass для получения подробной информации. См. начало этого раздела для объяснения вариантовisPUNCT_A,isPUNCT_L1,isPUNCT_uvchr,isPUNCT_utf8_safe,isPUNCT_LC,isPUNCT_LC_uvchr, иisPUNCT_LC_utf8_safe.bool isPUNCT(char ch) - isSPACE
-
Возвращает логическое значение, указывающее, является ли указанный символ символом пробела. Это аналогично тому, что
m/\s/соответствует в регулярном выражении. Начиная с Perl 5.18, это также соответствует тому, чтоm/[[:space:]]/делает. До версии 5.18, только формы этого макроса с учетом локали (сLCв их названиях) точно соответствовали тому, чтоm/[[:space:]]/делает. В этих выпусках единственное отличие в не-локализованных вариантах заключалось в том, чтоisSPACE()не соответствовал вертикальной табуляции. (См. "isPSXSPC" для макроса, который соответствует вертикальной табуляции во всех версиях.) См. начало этого раздела для объяснения вариантовisSPACE_A,isSPACE_L1,isSPACE_uvchr,isSPACE_utf8_safe,isSPACE_LC,isSPACE_LC_uvchr, иisSPACE_LC_utf8_safe.bool isSPACE(char ch) - isUPPER
-
Возвращает логическое значение, указывающее, является ли указанный символ заглавной буквой, аналогично
m/[[:upper:]]/. См. начало этого раздела для объяснения вариантовisUPPER_A,isUPPER_L1,isUPPER_uvchr,isUPPER_utf8_safe,isUPPER_LC,isUPPER_LC_uvchr, иisUPPER_LC_utf8_safe.bool isUPPER(char ch) - isWORDCHAR
-
Возвращает логическое значение, указывающее, является ли указанный символ символом слова, аналогично тому, что
m/\w/иm/[[:word:]]/соответствуют в регулярном выражении. Символ слова — это буквенный символ, десятичная цифра, соединительный пунктуационный символ (например, подчеркивание) или символ «метки», который присоединяется к одному из этих символов (например, некоторые виды диакритических знаков).isALNUM()— синоним, предоставленный для обратной совместимости, хотя символ слова включает больше, чем стандартное значение символа слова в языке C, то есть включает более чем только буквенно-цифровые символы. См. начало этого раздела для объяснения вариантовisWORDCHAR_A,isWORDCHAR_L1,isWORDCHAR_uvchr, иisWORDCHAR_utf8_safe.isWORDCHAR_LC,isWORDCHAR_LC_uvchr, иisWORDCHAR_LC_utf8_safeтакже описаны там, но дополнительно включают родное подчеркивание платформы.bool isWORDCHAR(char ch) - isXDIGIT
-
Возвращает булево значение, указывающее, является ли указанный символ шестнадцатеричной цифрой. В диапазоне ASCII это
[0-9A-Fa-f]. ВариантыisXDIGIT_A()иisXDIGIT_L1()идентичныisXDIGIT(). См. начало этого раздела для объяснения вариантовisXDIGIT_uvchr,isXDIGIT_utf8_safe,isXDIGIT_LC,isXDIGIT_LC_uvchr, иisXDIGIT_LC_utf8_safe.bool isXDIGIT(char ch)
Клонирование интерпретатора
- perl_clone
-
Создаёт и возвращает новый интерпретатор, клонируя текущий.
perl_cloneпринимает эти флаги в качестве параметров:CLONEf_COPY_STACKS- используется для, ну, копирования стеков также, без него мы клонируем только данные и обнуляем стеки, с ним мы копируем стеки и новый интерпретатор Perl готов к запуску в точно той же точке, что и предыдущий. Псевдо-код вилки использует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, пример такого кода находится в threads.xs create.CLONEf_CLONE_HOST- Это функция для win32, она игнорируется в unix, она сообщает коду win32host Perl (который написан на c++) клонировать себя, это необходимо в win32, если вы хотите запустить две нити одновременно, если вы просто хотите сделать что-то в отдельном интерпретаторе Perl, а затем выбросить его и вернуться к исходному, вам ничего не нужно делать.PerlInterpreter* perl_clone( PerlInterpreter *proto_perl, UV flags )
Временные метки области видимости на этапе компиляции
- BhkDISABLE
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Временно отключает запись в этой структуре BHK, очищая соответствующий флаг.
which- это препроцессорный токен, указывающий, какую запись отключить.void BhkDISABLE(BHK *hk, which) - BhkENABLE
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Включает запись в эту структуру BHK, установив соответствующий флаг.
which- это препроцессорный токен, указывающий, какую запись включить. Это вызовет утверждение (при -DDEBUGGING), если запись не содержит допустимого указателя.void BhkENABLE(BHK *hk, which) - BhkENTRY_set
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Устанавливает запись в структуре BHK и устанавливает флаги, чтобы указать, что она действительна.
which- это препроцессорный токен, указывающий, какую запись установить. Типptrзависит от записи.void BhkENTRY_set(BHK *hk, which, void *ptr) - blockhook_register
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Регистрирует набор временных меток, которые будут вызываться при изменении лексической области Perl на этапе компиляции. См. "Временные метки области видимости на этапе компиляции" в perlguts.
ПРИМЕЧАНИЕ: эту функцию необходимо явно вызвать как Perl_blockhook_register с параметром aTHX_.
void Perl_blockhook_register(pTHX_ BHK *hk)
Хеши подсказок COP
- cophh_2hv
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Генерирует и возвращает стандартный хеш Perl, представляющий полный набор пар ключ/значение в хеше подсказок cop
cophh.flagsв настоящее время не используется и должно быть равно нулю.HV * cophh_2hv(const COPHH *cophh, U32 flags) - cophh_copy
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Создаёт и возвращает полную копию хеша подсказок cop
cophh.COPHH * cophh_copy(COPHH *cophh) - cophh_delete_pv
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Подобно "cophh_delete_pvn", но принимает строку с нулевым завершением вместо пары строка/длина.
COPHH * cophh_delete_pv(const COPHH *cophh, const char *key, U32 hash, U32 flags) - cophh_delete_pvn
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Удаляет ключ и связанное с ним значение из хеша подсказок cop
cophh, и возвращает изменённый хеш. Возвращаемый указатель хеша, как правило, не совпадает с указателем хеша, который был передан. Входной хеш используется функцией, и указатель на него не должен использоваться в дальнейшем. Используйте "cophh_copy", если вам нужны оба хеша.Ключ задаётся
keypvиkeylen. Если уflagsустановлен битCOPHH_KEY_UTF8, октеты ключа интерпретируются как UTF-8, в противном случае они интерпретируются как Latin-1.hash- предварительно вычисленный хеш строки ключа или ноль, если он не был предварительно вычислен.COPHH * cophh_delete_pvn(COPHH *cophh, const char *keypv, STRLEN keylen, U32 hash, U32 flags) - cophh_delete_pvs
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Подобно "cophh_delete_pvn", но принимает литеральную строку вместо пары строка/длина и предварительно не вычисленный хеш.
COPHH * cophh_delete_pvs(const COPHH *cophh, "literal string" key, U32 flags) - cophh_delete_sv
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Подобно "cophh_delete_pvn", но принимает скаляр Perl вместо пары строка/длина.
COPHH * cophh_delete_sv(const COPHH *cophh, SV *key, U32 hash, U32 flags) - cophh_fetch_pv
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Подобно "cophh_fetch_pvn", но принимает строку с нулевым завершением вместо пары строка/длина.
SV * cophh_fetch_pv(const COPHH *cophh, const char *key, U32 hash, U32 flags) - cophh_fetch_pvn
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Ищет запись в хеше подсказок cop
cophhс ключом, заданнымkeypvиkeylen. Если уflagsустановлен битCOPHH_KEY_UTF8, октеты ключа интерпретируются как UTF-8, в противном случае - как Latin-1.hash- предварительно вычисленный хеш строки ключа или ноль, если он не был предварительно вычислен. Возвращает смертный скалярную копию значения, связанного с ключом, или&PL_sv_placeholderесли значение, связанное с ключом, отсутствует.SV * cophh_fetch_pvn(const COPHH *cophh, const char *keypv, STRLEN keylen, U32 hash, U32 flags) - cophh_fetch_pvs
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Подобно "cophh_fetch_pvn", но принимает литеральную строку вместо пары строка/длина и предварительно не вычисленный хеш.
SV * cophh_fetch_pvs(const COPHH *cophh, "literal string" key, U32 flags) - cophh_fetch_sv
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Подобно "cophh_fetch_pvn", но принимает скаляр Perl вместо пары строка/длина.
SV * cophh_fetch_sv(const COPHH *cophh, SV *key, U32 hash, U32 flags) - cophh_free
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Отбрасывает хеш подсказок cop
cophh, освобождая все ресурсы, связанные с ним.void cophh_free(COPHH *cophh) - cophh_new_empty
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Генерирует и возвращает свежий хеш подсказок cop, не содержащий записей.
COPHH * cophh_new_empty() - cophh_store_pv
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Подобно "cophh_store_pvn", но принимает строку с нулевым завершением вместо пары строка/длина.
COPHH * cophh_store_pv(const COPHH *cophh, const char *key, U32 hash, SV *value, U32 flags) - cophh_store_pvn
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Сохраняет значение, связанное с ключом, в хеше подсказок cop
cophh, и возвращает изменённый хеш. Возвращаемый указатель хеша, как правило, не совпадает с указателем хеша, который был передан. Входной хеш используется функцией, и указатель на него не должен использоваться в дальнейшем. Используйте "cophh_copy", если вам нужны оба хеша.Ключ задаётся
keypvиkeylen. Если уflagsустановлен битCOPHH_KEY_UTF8, октеты ключа интерпретируются как UTF-8, в противном случае - как Latin-1.hash- предварительно вычисленный хеш строки ключа или ноль, если он не был предварительно вычислен.value- скалярное значение для сохранения для этого ключа.valueкопируется этой функцией, которая, таким образом, не берёт на себя ответственность за любую ссылку на него, и последующие изменения в скаляре не будут отражены в значении, видимом в хеше подсказок cop. Сложные типы скаляров не будут сохраняться с целостностью ссылок, а будут преобразовываться в строки.COPHH * cophh_store_pvn(COPHH *cophh, const char *keypv, STRLEN keylen, U32 hash, SV *value, U32 flags) - cophh_store_pvs
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Подобно "cophh_store_pvn", но принимает литеральную строку вместо пары строка/длина и предварительно не вычисленный хеш.
COPHH * cophh_store_pvs(const COPHH *cophh, "literal string" key, SV *value, U32 flags) - cophh_store_sv
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Подобно "cophh_store_pvn", но принимает скаляр Perl вместо пары строка/длина.
COPHH * cophh_store_sv(const COPHH *cophh, SV *key, U32 hash, SV *value, U32 flags)
Чтение подсказок COP
- cop_hints_2hv
-
Генерирует и возвращает стандартный Perl-хэш, представляющий полный набор записей подсказок в cop
cop.flagsв настоящее время не используется и должно быть равно нулю.HV * cop_hints_2hv(const COP *cop, U32 flags) - cop_hints_fetch_pv
-
Аналогично "cop_hints_fetch_pvn", но принимает строку с нулевым завершением вместо пары «строка/длина».
SV * cop_hints_fetch_pv(const COP *cop, const char *key, U32 hash, U32 flags) - cop_hints_fetch_pvn
-
Ищет запись подсказки в cop
copс ключом, заданнымkeypvиkeylen. Еслиflagsимеет установленный битCOPHH_KEY_UTF8, октеты ключа интерпретируются как UTF-8, в противном случае — как Latin-1.hash— предварительно вычисленный хэш строки ключа или ноль, если он не был предварительно вычислен. Возвращает смертную скалярную копию значения, связанного с ключом, или&PL_sv_placeholderесли значение, связанное с ключом, отсутствует.SV * cop_hints_fetch_pvn(const COP *cop, const char *keypv, STRLEN keylen, U32 hash, U32 flags) - cop_hints_fetch_pvs
-
Аналогично "cop_hints_fetch_pvn", но принимает литеральную строку вместо пары «строка/длина» и не использует предварительно вычисленный хэш.
SV * cop_hints_fetch_pvs(const COP *cop, "literal string" key, U32 flags) - cop_hints_fetch_sv
-
Аналогично "cop_hints_fetch_pvn", но принимает Perl-скаляр вместо пары «строка/длина».
SV * cop_hints_fetch_sv(const COP *cop, SV *key, U32 hash, U32 flags)
Пользовательские операторы
- custom_op_register
-
Регистрирует пользовательский оператор. См. "Пользовательские операторы" в perlguts.
ПРИМЕЧАНИЕ: эту функцию необходимо явно вызывать как Perl_custom_op_register с параметром aTHX_.
void Perl_custom_op_register(pTHX_ Perl_ppaddr_t ppaddr, const XOP *xop) - custom_op_xop
-
Возвращает структуру XOP для данного пользовательского оператора. Этот макрос следует считать внутренним для
OP_NAMEи других макросов доступа: используйте их вместо него. Этот макрос вызывает функцию. До версии 5.19.6 это реализовывалось как функция.ПРИМЕЧАНИЕ: эту функцию необходимо явно вызывать как Perl_custom_op_xop с параметром aTHX_.
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— cpp-токен, указывающий, какой элемент установить. См. "Пользовательские операторы" в 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 ) - CvSTASH
-
Возвращает хранилище (stash) CV. Хранилище — это хеш таблицы символов, содержащий переменные пакета, относящиеся к пакету, в котором была определена подпрограмма. Для получения дополнительной информации, см. perlguts.
Это также имеет специальное применение с XS AUTOLOAD-подпрограммами. См. "Автозагрузка с XSUB" в perlguts.
HV* CvSTASH(CV* cv) - find_runcv
-
Находит CV, соответствующий текущей выполняемой подпрограмме или eval. Если
db_seqpне равно нулю, пропускаются CV, находящиеся в пакете DB, и*db_seqpзаполняется номером последовательности cop в момент входа DB::-кода. (Это позволяет отладчикам выполнять eval в области действия точки останова, а не в области действия самого отладчика.)CV* find_runcv(U32 *db_seqp) - get_cv
-
Использует
strlenдля получения длиныname, а затем вызываетget_cvn_flags.ПРИМЕЧАНИЕ: perl-форма этой функции устарела.
CV* get_cv(const char* name, I32 flags) - get_cvn_flags
-
Возвращает CV указанной Perl-подпрограммы.
flagsпередаютсяgv_fetchpvn_flags. ЕслиGV_ADDустановлено, и Perl-подпрограмма не существует, она будет объявлена (что эквивалентноsub name;). ЕслиGV_ADDне установлено, и подпрограмма не существует, возвращается NULL.ПРИМЕЧАНИЕ: perl-форма этой функции устарела.
CV* get_cvn_flags(const char* name, STRLEN len, I32 flags)
xsubpp переменные и внутренние функции
- ax
-
Переменная, устанавливаемая
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; - dUNDERBAR
-
Устанавливает любые переменные, необходимые макросу
UNDERBAR. Раньше использовалась для определенияpadoff_du, но сейчас это пустая операция. Тем не менее, настоятельно рекомендуется продолжать использовать её для обеспечения обратной и будущей совместимости.dUNDERBAR; - dXSARGS
-
Устанавливает указатели стека и метки для XSUB, вызывая
dSPиdMARK. Устанавливает переменныеaxиitemsпутём вызоваdAXиdITEMS. Обычно это происходит автоматически, когдаxsubpp.dXSARGS; - dXSI32
-
Устанавливает переменную
ixдля XSUB, имеющего псевдонимы. Обычно это происходит автоматически, когдаxsubpp.dXSI32; - items
-
Переменная, устанавливаемая
xsubppдля указания количества элементов в стеке. См. "Список параметров переменной длины" в perlxs.I32 items - ix
-
Переменная, устанавливаемая
xsubppдля указания того, какой из псевдонимов XSUB был использован для его вызова. См. "Ключевое слово ALIAS" в perlxs.I32 ix - RETVAL
-
Переменная, устанавливаемая
xsubppдля хранения возвращаемого значения XSUB. Это всегда правильный тип для XSUB. См. "Переменная RETVAL" в perlxs.(whatever) RETVAL - ST
-
Используется для доступа к элементам в стеке XSUB.
SV* ST(int ix) - THIS
-
Переменная, устанавливаемая
xsubppдля обозначения объекта в C++ XSUB. Это всегда правильный тип для объекта C++. См."CLASS"и "Использование XS с C++" в perlxs.(whatever) THIS - UNDERBAR
-
SV*, соответствующий переменной
$_. Работает даже если в области видимости имеется лексическая переменная$_. - XS
-
Макрос для объявления XSUB и его списка параметров C. Обрабатывается
xsubpp. Эквивалентно более явному макросуXS_EXTERNAL. - XS_EXTERNAL
-
Макрос для явного объявления XSUB и его списка параметров C, экспортируя символы.
- XS_INTERNAL
-
Макрос для объявления XSUB и его списка параметров C без экспорта символов. Обрабатывается
xsubppи обычно предпочтительнее, чем излишний экспорт символов XSUB.
Средства отладки
- dump_all
-
Выводит весь optree текущей программы, начиная с
PL_main_rootи доSTDERR. Также выводит optree для всех видимых подпрограмм вPL_defstash.void dump_all() - dump_packsubs
-
Выводит optree для всех видимых подпрограмм в
stash.void dump_packsubs(const HV* stash) - op_class
-
Определяет тип структуры, выделенной для данного оператора. Возвращает одно из значений перечисления OPclass, например, OPclass_LISTOP.
OPclass op_class(const OP *o) - op_dump
-
Выводит optree, начиная с оператора OP
oи доSTDERR.void op_dump(const OP *o) - sv_dump
-
Выводит содержимое SV в файловый дескриптор
STDERR.Пример вывода см. в Devel::Peek.
void sv_dump(SV* sv)
Функции отображения и вывода
- 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)
Функции встраивания
- 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
-
УСТЕРЕЖДЁННЫЙ! Планируется удалить эту функцию из будущих релизов Perl. Не используйте её для нового кода; удалите её из существующего кода.
До тех пор, пока лексическое
$_не было удалено, эта функция находила позицию лексической$_в заполнителе текущей выполняемой функции и возвращала смещение в текущем заполнителе илиNOT_IN_PAD.Теперь она всегда возвращает
NOT_IN_PAD.ПРИМЕЧАНИЕ: форма perl_ этой функции устарела.
PADOFFSET find_rundefsvoffset() - intro_my
-
«Ввести»
myпеременные в видимый статус. Это вызывается во время разбора в конце каждого оператора, чтобы сделать лексические переменные видимыми для последующих операторов.U32 intro_my() - load_module
-
Загружает модуль, имя которого указано в строковой части
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.void load_module(U32 flags, SV* name, SV* ver, ...) - newPADNAMELIST
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Создаёт новый список имён заполнителя.
max— это максимальный индекс, для которого выделяется память.PADNAMELIST * newPADNAMELIST(size_t max) - newPADNAMEouter
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Создаёт и возвращает новое имя заполнителя. Используйте эту функцию только для имён, которые ссылаются на внешние лексические переменные. (См. также "newPADNAMEpvn".)
outer— это внешнее имя заполнителя, которое этот дублирует. Возвращаемое имя заполнителя уже имеет установленный флагPADNAMEt_OUTER.PADNAME * newPADNAMEouter(PADNAME *outer) - 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, U32 flags, HV *typestash, HV *ourstash) - pad_add_name_pvn
-
Выделяет место в текущем компилируемом заполнителе для именованной лексической переменной. Сохраняет имя и другие метаданные в части имени заполнителя и готовится к управлению лексическим охватом переменной. Возвращает смещение выделенного слота заполнителя.
namepv/namelenуказывают имя переменной, включая ведущий знак. Еслиtypestashне равен null, имя относится к типизированной лексической переменной, и это идентифицирует тип. Еслиourstashне равен null, это лексическая ссылка на переменную пакета, и это идентифицирует пакет. Следующие флаги можно объединять операцией ИЛИ:padadd_OUR redundantly specifies if it's a package var padadd_STATE variable will retain value persistently padadd_NO_DUP_CHECK skip check for lexical shadowing PADOFFSET pad_add_name_pvn(const char *namepv, STRLEN namelen, U32 flags, HV *typestash, HV *ourstash) - pad_add_name_sv
-
Точно так же, как "pad_add_name_pvn", но принимает строку имени в виде SV вместо пары строка/длина.
PADOFFSET pad_add_name_sv(SV *name, U32 flags, HV *typestash, HV *ourstash) - pad_alloc
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Выделяет место в текущем заполнителе, возвращая смещение выделенного слота заполнителя. Имя первоначально не прикреплено к слоту заполнителя.
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
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Извлекает имя заполнителя по указанному индексу.
PADNAME * padnamelist_fetch(PADNAMELIST *pnl, SSize_t key) - padnamelist_store
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Сохраняет имя заполнителя (которое может быть null) по указанному индексу, освобождая любое существующее имя заполнителя в этом слоте.
PADNAME ** padnamelist_store(PADNAMELIST *pnl, SSize_t key, PADNAME *val) - pad_setsv
-
Установить значение по смещению
poв текущем (компилируемом или выполняемом) заполнителе. Используйте макросPAD_SETSV(), а не вызывайте эту функцию напрямую.void pad_setsv(PADOFFSET po, SV *sv) - pad_sv
-
Получить значение по смещению
poв текущем (компилируемом или выполняемом) заполнителе. Используйте макросPAD_SV, а не вызывайте эту функцию напрямую.SV * pad_sv(PADOFFSET po) - pad_tidy
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Подготовить заполнитель в конце компиляции кода, к которому он принадлежит. Выполняемые здесь задачи: удалить большую часть содержимого из заполнителей анонимных подпрограмм; присвоить ему
@_; пометить временные значения как таковые.typeуказывает тип подпрограммы:padtidy_SUB ordinary subroutine padtidy_SUBCLONE prototype for lexical closure padtidy_FORMAT format void pad_tidy(padtidy_type type) - perl_alloc
-
Выделяет новый интерпретатор Perl. См. perlembed.
PerlInterpreter* perl_alloc() - perl_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_parse
-
Указывает интерпретатору Perl проанализировать скрипт Perl. Эта функция выполняет большую часть начальной инициализации интерпретатора Perl. См. perlembed для руководства.
my_perlуказывает на интерпретатор Perl, который должен проанализировать скрипт. Он должен быть предварительно создан с помощью "perl_alloc" и "perl_construct".xsinitуказывает на функцию обратного вызова, которая будет вызвана для настройки возможности загрузки расширений XS для этого интерпретатора Perl, или может быть нулевой, чтобы не выполнять такую настройку.argcиmainпередают набор аргументов командной строки интерпретатору Perl, как обычно передаются функцииmainпрограммы на C.argv[argc]должно быть нулевым. Эти аргументы определяют скрипт для анализа, либо указанием файла скрипта, либо предоставлением скрипта в-eопцию. Если$0будет записано в интерпретатор Perl, то строки аргументов должны быть в области памяти для записи, а не просто строковые константы.envуказывает набор переменных среды, которые будут использоваться этим интерпретатором Perl. Если не нулевая, то она должна указывать на нуль-терминированный массив строк среды. Если нулевая, интерпретатор 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) - require_pv
-
Указывает Perl на
requireфайл, имя которого указано в строковом аргументе. Аналогично коду Perleval "require '$file'". Он даже реализован таким образом; используйте вместо этого load_module.ПРИМЕЧАНИЕ: форма perl_ этой функции устарела.
void require_pv(const char* pv)
Обработка исключений (простые) макросы
- dXCPT
-
Настраивает необходимые локальные переменные для обработки исключений. См. "Обработка исключений" в perlguts.
dXCPT; - XCPT_CATCH
-
Вводит блок обработки исключений. См. "Обработка исключений" в perlguts.
- XCPT_RETHROW
-
Перебрасывает ранее перехваченное исключение. См. "Обработка исключений" в perlguts.
XCPT_RETHROW; - XCPT_TRY_END
-
Завершает блок try. См. "Обработка исключений" в perlguts.
- XCPT_TRY_START
-
Начинает блок try. См. "Обработка исключений" в perlguts.
Функции в файле pp_sort.c
- sortsv_flags
-
Сортирует массив указателей SV на месте с заданной функцией сравнения с различными параметрами флага SORTf_*.
void sortsv_flags(SV** array, size_t num_elts, SVCOMPARE_t cmp, U32 flags)
Функции в файле scope.c
- save_gp
-
Сохраняет текущий GP для gv в стеке сохранения для восстановления при выходе из области видимости.
Если empty истина, заменяет GP новым GP.
Если empty ложь, помечает gv как GVf_INTRO, чтобы следующее присваивание ссылки было локализовано, что и используется в
local *foo = $someref;.void save_gp(GV* gv, I32 empty)
Функции в файле vutil.c
- new_version
-
Возвращает новый объект версии, основанный на переданном SV:
SV *sv = new_version(SV *ver);Не изменяет переданный ver SV. Обратитесь к "upg_version", если вы хотите обновить SV.
SV* new_version(SV *ver) - 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 до объекта версии.
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) -
Значения "Gimme"
- G_ARRAY
-
Используется для указания контекста списка. См.
"GIMME_V","GIMME"и perlcall. - G_DISCARD
-
Указывает, что аргументы, возвращаемые из обратного вызова, должны быть отброшены. См. perlcall.
- G_EVAL
-
Используется для принудительного добавления Perl
evalобёртки вокруг обратного вызова. См. perlcall. - GIMME
-
Обратно совместимая версия
GIMME_V, которая может возвращать толькоG_SCALARилиG_ARRAY; в контексте void она возвращаетG_SCALAR. Устаревшая. ИспользуйтеGIMME_Vвместо неё.U32 GIMME - GIMME_V
-
Аналог Perl
wantarrayдля разработчика XSUB. ВозвращаетG_VOID,G_SCALARилиG_ARRAYдля контекста void, скаляр или список, соответственно. См. perlcall для примера использования.U32 GIMME_V - G_NOARGS
-
Указывает, что обратный вызов не получает аргументы. См. perlcall.
- G_SCALAR
-
Используется для указания скалярного контекста. См.
"GIMME_V","GIMME", и perlcall. - G_VOID
-
Используется для указания контекста void. См.
"GIMME_V"и perlcall.
Глобальные переменные
Эти переменные являются глобальными для всего процесса. Они общие для всех интерпретаторов и всех потоков в процессе. Любые не документированные здесь переменные могут быть изменены или удалены без предварительного уведомления, поэтому не используйте их! Если вы считаете, что вам действительно нужно использовать недокументированную переменную, отправьте письмо по адресу perl5-porters@perl.org. Возможно, там кто-то укажет способ достижения вашей цели без использования внутренней переменной. Но если нет, вы должны получить разрешение на документацию и использование переменной.
- PL_check
-
Массив, индексированный по коду операции, функций, которые будут вызываться на фазе "check" построения дерева optree во время компиляции Perl-кода. Для большинства (но не всех) типов op, после того, как op был первоначально построен и заполнен дочерними op, он будет отфильтрован через функцию check, на которую ссылается соответствующий элемент этого массива. Новый op передаётся в качестве единственного аргумента функции check, и функция check возвращает завершённый op. Функция check может (как следует из названия) проверить op на корректность и сигнализировать об ошибках. Она также может инициализировать или изменять части op, или производить более радикальные операции, такие как добавление или удаление дочерних op, или даже отбросить op и вернуть другой op на его место.
Этот массив указателей на функции является удобным местом для подключения к процессу компиляции. Модуль XS может поместить собственную функцию check вместо любой стандартной, чтобы повлиять на компиляцию определённого типа op. Однако пользовательская функция check никогда не должна полностью заменять стандартную функцию check (или даже пользовательскую функцию check из другого модуля). Модуль, изменяющий проверку, вместо этого должен обрамлять существующую функцию check. Пользовательская функция check должна быть избирательной в отношении того, когда применять своё пользовательское поведение. В обычном случае, когда она решает ничего не делать со структурой op, она должна связать существующую функцию op. Таким образом, функции check связаны в цепочку, с базовой функцией проверки ядра в конце.
Для обеспечения потоковой безопасности модули не должны писать напрямую в этот массив. Вместо этого используйте функцию "wrap_op_checker".
- PL_keyword_plugin
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Указатель на функцию, используемую для обработки расширенных ключевых слов. Функция должна быть объявлена как
int keyword_plugin_function(pTHX_ char *keyword_ptr, STRLEN keyword_len, OP **op_ptr)Функция вызывается из токенизатора всякий раз, когда обнаруживается возможный ключевой слова.
keyword_ptrуказывает на слово в буфере входных данных анализатора, иkeyword_lenзадаёт его длину; оно не является null-терминированным. Ожидается, что функция изучит слово и, возможно, другое состояние, такое как %^H, чтобы решить, хочет ли она обработать его как расширенный ключевой слова. Если нет, функция должна вернутьKEYWORD_PLUGIN_DECLINE, и обычный процесс анализатора продолжится.Если функция хочет обработать ключевое слово, она должна сначала обработать все, что следует за ключевым словом, являющимся частью синтаксиса, введённого ключевым словом. Подробности см. в разделе "Интерфейс распознавателя".
При обработке ключевого слова плагин-функция должна построить дерево структур
OP, представляющих обработанный код. Корень дерева должен быть сохранён в*op_ptr. Затем функция возвращает константу, указывающую синтаксическую роль обработанной конструкции:KEYWORD_PLUGIN_STMTесли это полное утверждение, илиKEYWORD_PLUGIN_EXPRесли это выражение. Обратите внимание, что конструкция утверждения не может быть использована внутри выражения (кроме как черезdo BLOCKи подобные), а выражение не является полным утверждением (требуется хотя бы терминальный символ).При обработке ключевого слова плагин-функция также может иметь побочные эффекты (во время компиляции). Она может изменять
%^H, определять функции и так далее. Обычно, если побочные эффекты являются главной целью обработчика, он не хочет генерировать какие-либо op для включения в обычную компиляцию. В этом случае всё ещё требуется предоставить дерево op, но достаточно сгенерировать единственный null op.Вот как функция
*PL_keyword_pluginдолжна работать в целом. Тем не менее, обычно не заменяют полностью существующую обработчик функцию. Вместо этого скопируйтеPL_keyword_pluginперед назначением собственной функции указателю. Ваша обработчик функция должна искать ключевые слова, которыми она интересуется, и обрабатывать их. Где она не интересуется, она должна вызвать сохранённую плагин-функцию, передав полученные аргументы. Таким образомPL_keyword_pluginфактически указывает на цепочку обработчик функций, каждая из которых имеет возможность обработать ключевые слова, и только последняя функция в цепочке (встроенная в ядро Perl) обычно вернётKEYWORD_PLUGIN_DECLINE.Для обеспечения потоковой безопасности модули не должны устанавливать эту переменную напрямую. Вместо этого используйте функцию "wrap_keyword_plugin".
Функции GV
GV — это структура, соответствующая Perl typeglob, например *foo. Это структура, которая хранит указатель на скаляр, массив, хеш и т. д., соответствующие $foo, @foo, %foo.
GV обычно встречаются в качестве значений в хранилищах (хешах таблицы символов), где Perl хранит свои глобальные переменные.
- GvAV
-
Возвращает AV из GV.
AV* GvAV(GV* gv) - gv_const_sv
-
Если
gvявляется typeglob, запись подпрограммы которого является константной подпрограммой, подходящей для инлайнинга, илиgvявляется ссылкой-заменителем, которая будет преобразована в такой typeglob, то возвращает значение, возвращаемое подпрограммой. В противном случае возвращаетNULL.SV* gv_const_sv(GV* gv) - GvCV
-
Возвращает CV из GV.
CV* GvCV(GV* gv) - gv_fetchmeth
-
Подобно gv_fetchmeth_pvn, но не имеет параметра флагов.
GV* gv_fetchmeth(HV* stash, const char* name, STRLEN len, I32 level) - gv_fetchmethod_autoload
-
Возвращает glob, который содержит подпрограмму для вызова метода на
stash. На самом деле, при наличии автозагрузки, это может быть glob для "AUTOLOAD". В этом случае соответствующая переменная$AUTOLOADуже настроена.Третий параметр
gv_fetchmethod_autoloadопределяет, выполняется ли поиск AUTOLOAD, если данный метод отсутствует: ненулевое значение означает да, искать AUTOLOAD; нулевое значение означает нет, не искать AUTOLOAD. Вызовgv_fetchmethodэквивалентен вызовуgv_fetchmethod_autoloadс ненулевым параметромautoload.Эти функции предоставляют
"SUPER"в качестве префикса имени метода. Обратите внимание, что если вы хотите сохранить возвращенный glob надолго, вам необходимо проверить, является ли он "AUTOLOAD", так как в более позднее время вызов может загрузить другую подпрограмму из-за изменения значения$AUTOLOAD. Используйте glob, созданный как побочный эффект, для этого.Эти функции имеют те же побочные эффекты, что и
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
-
Возвращает glob с заданным
nameи определенной подпрограммой илиNULL. Glob находится в заданномstash, или в стеках, доступных через@ISAиUNIVERSAL::.Аргумент
levelдолжен быть либо 0, либо -1. Еслиlevel==0, то в качестве побочного эффекта создает glob с заданнымnameв заданномstash, который в случае успеха содержит псевдоним для подпрограммы и настраивает кеширование информации для этого glob.Единственными значимыми значениями для
flagsявляютсяGV_SUPERиSVf_UTF8.GV_SUPERуказывает, что мы хотим найти метод в суперклассахstash.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(), но также ищет подпрограммы с автозагрузкой. Возвращает glob для подпрограммы.Для подпрограммы с автозагрузкой без 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) - 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
-
Преобразует скаляр в typeglob. Это typeglob, который нельзя привести к другому типу; присвоение ссылки к нему будет присвоено одному из его слотов, а не перезапишет его, как это происходит с typeglobs, созданными
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 SVf_UTF8 GV_NOADD_NOINIT GV_NOINIT GV_NOEXPAND GV_ADDMGНаиболее важными из которых, вероятно, являются
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("literal string" name, I32 create) - gv_stashsv
-
Возвращает указатель на стека для заданного пакета. Смотрите
"gv_stashpvn".Обратите внимание, что этот интерфейс предпочтительнее
gv_stashpvnпо соображениям производительности.HV* gv_stashsv(SV* sv, I32 flags) - GvSV
-
Возвращает SV из GV.
SV* GvSV(GV* gv) - setdefout
-
Устанавливает
PL_defoutgv, стандартный дескриптор файла для вывода, в переданный typeglob. Так какPL_defoutgv"владеет" ссылкой на свой typeglob, счетчик ссылок переданного typeglob увеличивается на единицу, а счетчик ссылок typeglob, на который указываетPL_defoutgv, уменьшается на единицу.void setdefout(GV* gv)
Полезные значения
- Nullav
-
Указатель на нулевой AV.
(устарело - используйте
(AV *)NULLвместо этого) - Nullch
-
Указатель на нулевой символ. (Больше недоступен, когда
PERL_COREопределен.) - Nullcv
-
Указатель на нулевой CV.
(устарело - используйте
(CV *)NULLвместо этого) - Nullhv
-
Указатель на нулевой HV.
(устарело - используйте
(HV *)NULLвместо этого) - Nullsv
-
Указатель на нулевой SV. (Больше недоступен, когда
PERL_COREопределен.)
Функции манипулирования хэш-таблицами
Структура HV представляет собой хэш-таблицу Perl. Она состоит в основном из массива указателей, каждый из которых указывает на связанный список структур HE. Массив индексируется по хэш-функции ключа, поэтому каждый связанный список представляет все записи хэша с одинаковым значением хэша. Каждая HE содержит указатель на фактическое значение плюс указатель на структуру HEK, которая содержит ключ и хэш-значение.
- cop_fetch_label
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Возвращает метку, присоединенную к cop. Указатель флагов может быть установлен на
SVf_UTF8или 0.const char * cop_fetch_label(COP *const cop, STRLEN *len, U32 *flags) - cop_store_label
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Сохраняет метку в
cop_hints_hash. Для метки UTF-8 необходимо установить флаги наSVf_UTF8.void cop_store_label(COP *const cop, const char *label, STRLEN len, U32 flags) - get_hv
-
Возвращает HV указанного Perl-хэша.
flagsпередаются вgv_fetchpv. ЕслиGV_ADDустановлен, и Perl-переменная не существует, она будет создана. Еслиflagsравно нулю, и переменная не существует, возвращаетсяNULL.ПРИМЕЧАНИЕ: форма perl_ этой функции устарела.
HV* get_hv(const char *name, I32 flags) - 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может быть типом дляchar.U32 HeUTF8(HE* he) - HeVAL
-
Возвращает слот значения (тип
SV*) хранящийся в записи хэша. Может быть присвоено.SV *foo= HeVAL(hv); HeVAL(hv)= sv; SV* HeVAL(HE* he) - hv_assert
-
Проверяет, находится ли хэш в внутренне согласованном состоянии.
void hv_assert(HV *hv) - 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 *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 Unicode.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 Unicode. Еслиlvalустановлено, то запрос будет частью сохранения. Это означает, что если в хэше нет значения, связанного с данным ключом, то оно создаётся, и возвращается указатель на него. НаSV*к которому он указывает, можно назначить значение. Но всегда проверяйте, что возвращаемое значение не нулевое, прежде чем выполнять обращение к нему как кSV*.См. "Понимание магии привязанных хэшей и массивов" в perlguts для получения дополнительной информации о использовании этой функции для привязанных хэшей.
SV** hv_fetch(HV *hv, const char *key, I32 klen, I32 lval) - hv_fetchs
-
Подобно
hv_fetch, но принимает строку-литерал вместо пары строка/длина.SV** hv_fetchs(HV* tb, "literal string" key, I32 lval) - hv_fetch_ent
-
Возвращает запись хэша, соответствующую указанному ключу в хэше.
hashдолжен быть допустимым предварительно вычисленным значением хэша для данногоkey, или 0, если вы хотите, чтобы функция его вычислила. Еслиlvalустановлено, запрос будет частью сохранения. Убедитесь, что возвращаемое значение не нулевое, прежде чем обращаться к нему. Возвращаемое значение, когдаhvэто привязанный хэш, является указателем на статическое местоположение, поэтому обязательно скопируйте структуру, если вам нужно сохранить её где-то.См. "Понимание магии привязанных хэшей и массивов" в perlguts для получения дополнительной информации о использовании этой функции для привязанных хэшей.
HE* hv_fetch_ent(HV *hv, SV *keysv, I32 lval, U32 hash) - hv_fill
-
Возвращает количество ведер хэша, которые используются.
Эта функция обернута макросом
HvFILL.Начиная с Perl 5.25, эта функция используется только в отладочных целях, и количество используемых ведер хэша не кешируется, поэтому эта функция может быть дорогостоящей в исполнении, поскольку ей необходимо проитерироваться по всем ведрам хэша.
STRLEN hv_fill(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_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
-
Возвращает длину имени хранилища.
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отрицательно, ключ предполагается закодированным в Unicode UTF-8. Параметрhash— предварительно вычисленное значение хеша; если оно равно нулю, Perl вычислит его.Значение возврата будет
NULLв случае неудачи операции или если значение не нужно было фактически хранить в хеше (например, в случае привязанных хешей). В противном случае к нему можно обратиться, чтобы получить исходноеSV*. Обратите внимание, что вызывающий код отвечает за надлежащее увеличение счётчика ссылок наvalперед вызовом и уменьшение его, если функция вернулаNULL. По существу, успешныйhv_storeпринимает владение одной ссылкой наval. Это обычно то, что вам нужно; у только что созданного SV счётчик ссылок равен единице, поэтому если весь ваш код только создаёт 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, "literal string" key, SV* val) - hv_store_ent
-
Сохраняет
valв хеше. Ключ хеша указан какkey. Параметрhash— предварительно вычисленное значение хеша; если оно равно нулю, Perl вычислит его. Значение возврата — новая запись хеша, созданная. Это будетNULLв случае неудачи операции или если значение не нужно было фактически хранить в хеше (например, в случае привязанных хешей). В противном случае содержимое значения возврата может быть обработано с использованием макросовHe?описанных здесь. Обратите внимание, что вызывающий код отвечает за надлежащее увеличение счётчика ссылок наvalперед вызовом и уменьшение его, если функция вернула NULL. По существу, успешныйhv_store_entпринимает владение одной ссылкой наval. Это обычно то, что вам нужно; у только что созданного SV счётчик ссылок равен единице, поэтому если весь ваш код только создаёт SV и сохраняет их в хеш,hv_storeбудет владеть единственной ссылкой на новый SV, и вашему коду не нужно будет делать ничего больше для очистки. Обратите внимание, чтоhv_store_entсчитывает толькоkey; в отличие отval, он не принимает владения им, поэтому поддержание правильного счётчика ссылок на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()
Управление хуками
Эти функции предоставляют удобный и потокобезопасный способ управления переменными хуков.
- wrap_op_checker
-
Добавляет C-функцию в цепочку функций проверки для указанного типа оператора. Это предпочтительный способ управления массивом "PL_check".
opcodeуказывает, какой тип оператора должен быть затронут.new_checker— указатель на C-функцию, которая должна быть добавлена в цепочку проверки для данного кода операции, аnew_checkerуказывает на место хранения указателя на следующую функцию в цепочке. Значение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)
Интерфейс лексического анализатора
Это нижний уровень Perl-парсера, управляющий символами и токенами.
- lex_bufutf8
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Указывает, следует ли интерпретировать байты в буфере лексера ("PL_parser->linestr") как кодировку UTF-8 для символов Юникода. В противном случае они должны интерпретироваться как символы Latin-1. Это аналогично флагу
SvUTF8для скаляров.В режиме UTF-8 нет гарантии, что буфер лексера фактически содержит корректное кодирование UTF-8. Код разбора должен быть устойчивым к некорректной кодировке.
Фактический флаг
SvUTF8скаляра "PL_parser->linestr" важен, но не определяет всю историю кодировки входных символов. Обычно при чтении файла скаляр содержит байты, а его флагSvUTF8выключен, но байты должны интерпретироваться как UTF-8, если в силе pragmause utf8. Однако при выполнении string eval скаляр может иметь флагSvUTF8, и в этом случае его байты должны интерпретироваться как UTF-8, если не в силе pragmause bytes. Эта логика может измениться в будущем; используйте эту функцию вместо реализации логики самостоятельно.bool lex_bufutf8() - lex_discard_to
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Отбрасывает первую часть буфера "PL_parser->linestr" до
ptr. Остальное содержимое буфера будет перемещено, и все указатели в буфер будут обновлены соответствующим образом.ptrне должен находиться дальше в буфере, чем позиция "PL_parser->bufptr": запрещается отбрасывать текст, который еще не был прочитан лексером.Обычно нет необходимости делать это напрямую, так как достаточно использовать неявное поведение отбрасывания "lex_next_chunk" и связанных с ним функций. Однако если токен охватывает несколько строк, и код лексера сохранил несколько строк текста в буфере для этой цели, то после завершения токена было бы целесообразно явно отбросить теперь ненужные предыдущие строки, чтобы избежать дальнейшего увеличения буфера многострочными токенами без ограничений.
void lex_discard_to(char *ptr) - 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
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Читает следующий фрагмент текста для разбора, добавляя его к "PL_parser->linestr". Это необходимо вызвать, когда код разбора дошел до конца текущего фрагмента и хочет получить больше информации. Обычно, но не обязательно, разбор должен был израсходовать весь текущий фрагмент в этот момент.
Если "PL_parser->bufptr" указывает на самый конец текущего фрагмента (т. е. текущий фрагмент полностью обработан), обычно текущий фрагмент отбрасывается одновременно с чтением нового фрагмента. Если у
flagsустановлен флагLEX_KEEP_PREVIOUS, текущий фрагмент не будет отброшен. Если текущий фрагмент не был полностью обработан, он не будет отброшен независимо от флага.Возвращает true, если в буфер был добавлен новый текст, или false, если буфер достиг конца входного текста.
bool lex_next_chunk(U32 flags) - lex_peek_unichar
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Предварительно просматривает один (символ Юникода) в тексте, который в настоящее время разбирается. Возвращает код точки (целое значение без знака) следующего символа или -1, если разбор достиг конца входного текста. Чтобы прочитать просмотренный символ, используйте "lex_read_unichar".
Если следующий символ находится (или простирается в) следующий фрагмент входного текста, следующий фрагмент будет прочитан. Обычно текущий фрагмент отбрасывается одновременно, но если у
flagsустановлен флагLEX_KEEP_PREVIOUS, текущий фрагмент не будет отброшен.Если вход интерпретируется как UTF-8 и обнаружена ошибка кодировки UTF-8, генерируется исключение.
I32 lex_peek_unichar(U32 flags) - lex_read_space
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Читает необязательные пробелы в стиле Perl в тексте, который в настоящее время разбирается. Пробелы могут включать обычные пробельные символы и комментарии в стиле Perl. Директивы
#lineобрабатываются при обнаружении. "PL_parser->bufptr" перемещается за пробелами, так что он указывает на не-пробельный символ (или конец входного текста).Если пробелы простираются в следующий фрагмент входного текста, следующий фрагмент будет прочитан. Обычно текущий фрагмент отбрасывается одновременно, но если у
flagsустановлен флагLEX_KEEP_PREVIOUS, текущий фрагмент не будет отброшен.void lex_read_space(U32 flags) - 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
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Читает следующий (символ Юникода) в тексте, который в настоящее время разбирается. Возвращает код точки (целое без знака) прочитанного символа и перемещает "PL_parser->bufptr" за символом или возвращает -1, если разбор достиг конца входного текста. Для неразрушительного просмотра следующего символа используйте "lex_peek_unichar".
Если следующий символ находится (или простирается в) следующий фрагмент входного текста, следующий фрагмент будет прочитан. Обычно текущий фрагмент отбрасывается одновременно, но если у
flagsустановлен флагLEX_KEEP_PREVIOUS, текущий фрагмент не будет отброшен.Если вход интерпретируется как UTF-8 и обнаружена ошибка кодировки UTF-8, генерируется исключение.
I32 lex_read_unichar(U32 flags) - 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
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Вставляет символы в буфер лексера ("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
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Вставляет символы в буфер лексера ("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_pvn", но принимает литеральную строку вместо пары "строка/длина".
void lex_stuff_pvs("literal string" pv, U32 flags) - 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
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Отбрасывает текст, который собирается проанализировать, от "PL_parser->bufptr" до
ptr. Текст, следующий заptr, будет перемещён, а буфер укорочен. Это скрывает отбрасываемый текст от любого кода лексического анализа, который выполняется позже, как если бы этот текст никогда не появлялся.Это не стандартный способ потребления проанализированного текста. Для этого используйте "lex_read_to".
void lex_unstuff(char *ptr) - parse_arithexpr
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Разбирает арифметическое выражение Perl. Оно может содержать операторы с приоритетом до битовых сдвигов. Выражение должно быть после (и таким образом завершаться) либо оператором сравнения или оператором более низкого приоритета, либо чем-то, что обычно завершает выражение, например, точкой с запятой. Если у
flagsустановлен битPARSE_OPTIONAL, то выражение является необязательным, в противном случае оно обязательно. От пользователя требуется убедиться, что динамическое состояние парсера ("PL_parser" и т. д.) правильно отражает источник разбираемого кода и лексический контекст выражения.Возвращается дерево операций, представляющее выражение. Если необязательное выражение отсутствует, возвращается нулевой указатель, в противном случае указатель будет ненулевым.
Если при разборе или компиляции произошла ошибка, в большинстве случаев возвращается корректное дерево операций. Ошибка отражается в состоянии парсера, обычно приводя к одному исключению на верхнем уровне разбора, которое охватывает все возникшие ошибки компиляции. Некоторые ошибки компиляции, однако, сгенерируют исключение немедленно.
OP * parse_arithexpr(U32 flags) - parse_barestmt
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Разбирает одно немодифицированное утверждение Perl. Это может быть обычное императивное утверждение или объявление, имеющее эффект во время компиляции. Оно не включает метки или другие приставки. От пользователя требуется убедиться, что динамическое состояние парсера ("PL_parser" и т. д.) правильно отражает источник разбираемого кода и лексический контекст оператора.
Возвращается дерево операций, представляющее оператор. Может быть нулевым указателем, если оператор равен нулю, например, если он фактически был определением подпрограммы (что имеет побочные эффекты во время компиляции). Если не равен нулю, это операции, непосредственно реализующие оператор, подходящие для передачи в "newSTATEOP". Обычно он не будет включать оператор
nextstateили эквивалент (кроме тех, которые встроены в область, полностью заключенную в оператор).Параметр
flagsзарезервирован для будущего использования и всегда должен быть равен нулю.OP * parse_barestmt(U32 flags) - parse_block
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Разбирает один завершённый блок кода Perl. Он состоит из открывающей фигурной скобки, последовательности операторов и закрывающей фигурной скобки. Блок представляет собой лексическую область видимости, поэтому переменные
myи различные эффекты во время компиляции могут быть в нём содержатся. От пользователя требуется убедиться, что динамическое состояние парсера ("PL_parser" и т. д.) правильно отражает источник разбираемого кода и лексический контекст оператора.Возвращается дерево операций, представляющее блок кода. Это всегда реальная операция, никогда не нулевой указатель. Обычно это список
lineseq, включаяnextstateили эквивалентные операции. Никакие операции для построения областей видимости времени выполнения не включаются из-за того, что это блок.Если при разборе или компиляции произошла ошибка, в большинстве случаев возвращается корректное дерево операций (вероятно, нулевой указатель). Ошибка отражается в состоянии парсера, обычно приводя к одному исключению на верхнем уровне разбора, которое охватывает все возникшие ошибки компиляции. Некоторые ошибки компиляции, однако, сгенерируют исключение немедленно.
Параметр
flagsзарезервирован для будущего использования и всегда должен быть равен нулю.OP * parse_block(U32 flags) - parse_fullexpr
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Разбирает одно полное выражение Perl. Это позволяет использовать полную грамматику выражений, включая операторы с низким приоритетом, такие как
or. Выражение должно быть после (и таким образом завершаться) маркером, который обычно завершает выражение: конец файла, закрывающая скобка, точка с запятой или одно из ключевых слов, которое сигнализирует о модификаторе оператора выражения-оператора. Если уflagsустановлен битPARSE_OPTIONAL, то выражение является необязательным, в противном случае оно обязательно. От пользователя требуется убедиться, что динамическое состояние парсера ("PL_parser" и т. д.) правильно отражает источник разбираемого кода и лексический контекст выражения.Возвращается дерево операций, представляющее выражение. Если необязательное выражение отсутствует, возвращается нулевой указатель, в противном случае указатель будет ненулевым.
Если при разборе или компиляции произошла ошибка, в большинстве случаев возвращается корректное дерево операций. Ошибка отражается в состоянии парсера, обычно приводя к одному исключению на верхнем уровне разбора, которое охватывает все возникшие ошибки компиляции. Некоторые ошибки компиляции, однако, сгенерируют исключение немедленно.
OP * parse_fullexpr(U32 flags) - parse_fullstmt
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Разбирает один завершённый оператор Perl. Это может быть обычный императивный оператор или объявление, имеющее эффект во время компиляции, и может включать необязательные метки. От пользователя требуется убедиться, что динамическое состояние парсера ("PL_parser" и т. д.) правильно отражает источник разбираемого кода и лексический контекст оператора.
Возвращается дерево операций, представляющее оператор. Может быть нулевым указателем, если оператор равен нулю, например, если он фактически был определением подпрограммы (что имеет побочные эффекты во время компиляции). Если не равен нулю, это результат вызова "newSTATEOP", обычно включающий оператор
nextstateили эквивалент.Если при разборе или компиляции произошла ошибка, в большинстве случаев возвращается корректное дерево операций (вероятно, нулевой указатель). Ошибка отражается в состоянии парсера, обычно приводя к одному исключению на верхнем уровне разбора, которое охватывает все возникшие ошибки компиляции. Некоторые ошибки компиляции, однако, сгенерируют исключение немедленно.
Параметр
flagsзарезервирован для будущего использования и всегда должен быть равен нулю.OP * parse_fullstmt(U32 flags) - parse_label
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Разбирает одну метку, возможно необязательную, типа, которая может предшествовать оператору Perl. От пользователя требуется убедиться, что динамическое состояние парсера ("PL_parser" и т. д.) правильно отражает источник разбираемого кода. Если у
flagsустановлен битPARSE_OPTIONAL, то метка необязательная, в противном случае она обязательная.Имя метки возвращается в виде свежего скаляра. Если необязательная метка отсутствует, возвращается нулевой указатель.
Если при разборе произошла ошибка, которая может произойти только если метка обязательная, возвращается корректная метка. Ошибка отражается в состоянии парсера, обычно приводя к одному исключению на верхнем уровне разбора, которое охватывает все возникшие ошибки компиляции.
SV * parse_label(U32 flags) - parse_listexpr
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Разбирает выражение списка Perl. Оно может содержать операторы с приоритетом до оператора запятой. Выражение должно быть после (и таким образом завершаться) либо оператором логики низкого приоритета, таким как
or, либо чем-то, что обычно завершает выражение, например, точкой с запятой. Если уflagsустановлен битPARSE_OPTIONAL, то выражение необязательное, в противном случае оно обязательное. От пользователя требуется убедиться, что динамическое состояние парсера ("PL_parser" и т. д.) правильно отражает источник разбираемого кода и лексический контекст выражения.Возвращается дерево операций, представляющее выражение. Если необязательное выражение отсутствует, возвращается нулевой указатель, в противном случае указатель будет ненулевым.
Если при разборе или компиляции произошла ошибка, в большинстве случаев возвращается корректное дерево операций. Ошибка отражается в состоянии парсера, обычно приводя к одному исключению на верхнем уровне разбора, которое охватывает все возникшие ошибки компиляции. Некоторые ошибки компиляции, однако, сгенерируют исключение немедленно.
OP * parse_listexpr(U32 flags) - parse_stmtseq
-
ПРИМЕЧАНИЕ: эта функция является экспериментальной и может быть изменена или удалена без предварительного уведомления.
Разбор последовательности нуля или более Perl-выражений. Эти выражения могут быть обычными императивными выражениями, включая необязательные метки или объявления, имеющие эффект во время компиляции, или любое их сочетание. Последовательность выражений завершается, когда встречается закрывающая фигурная скобка или конец файла в месте, где новое выражение могло бы быть допустимым. От пользователя зависит обеспечение правильной установки динамического состояния парсера ("PL_parser" и т. д.) для отражения источника анализируемого кода и лексического контекста выражений.
Дерево синтаксического анализа, представляющее последовательность выражений, возвращается. Это может быть указатель на нулевой элемент, если все выражения были нулевыми, например, если выражений не было или были только определения подпрограмм (которые имеют побочные эффекты во время компиляции). Если не нулевой, это будет
lineseqсписок, обычно включающийnextstateили эквивалентные операции.Если при разборе или компиляции произошла ошибка, в большинстве случаев возвращается допустимое дерево синтаксического анализа. Об ошибке отражается в состоянии парсера, что обычно приводит к одному исключению на верхнем уровне разбора, охватывающему все произошедшие ошибки компиляции. Однако некоторые ошибки компиляции приведут к немедленному возникновению исключения.
Параметр
flagsзарезервирован для будущего использования и всегда должен быть равен нулю.OP * parse_stmtseq(U32 flags) - parse_termexpr
-
ПРИМЕЧАНИЕ: эта функция является экспериментальной и может быть изменена или удалена без предварительного уведомления.
Разбор Perl-выражения типа терм. Оно может содержать операторы с приоритетом вплоть до операторов присваивания. Выражение должно быть после (и таким образом завершаться) либо запятой, либо оператором с более низким приоритетом, либо чем-то, что обычно завершает выражение, например, точкой с запятой. Если
flagsимеет битPARSE_OPTIONAL, то выражение является необязательным, в противном случае оно является обязательным. От пользователя зависит обеспечение правильной установки динамического состояния парсера ("PL_parser" и т. д.) для отражения источника анализируемого кода и лексического контекста выражения.Возвращается дерево синтаксического анализа, представляющее выражение. Если необязательное выражение отсутствует, возвращается нулевой указатель, в противном случае указатель будет не нулевым.
Если при разборе или компиляции произошла ошибка, в большинстве случаев возвращается допустимое дерево синтаксического анализа. Об ошибке отражается в состоянии парсера, что обычно приводит к одному исключению на верхнем уровне разбора, охватывающему все произошедшие ошибки компиляции. Однако некоторые ошибки компиляции приведут к немедленному возникновению исключения.
OP * parse_termexpr(U32 flags) - PL_parser
-
Указатель на структуру, описывающую состояние операции разбора, которая в настоящее время выполняется. Указатель может быть локально изменен для выполнения вложенного разбора без вмешательства в состояние внешнего разбора. Индивидуальные члены
PL_parserимеют свою документацию. - PL_parser->bufend
-
ПРИМЕЧАНИЕ: эта функция является экспериментальной и может быть изменена или удалена без предварительного уведомления.
Прямой указатель на конец блока текста, который в настоящее время анализируется, конец буфера лексического анализатора. Это равно
SvPVX(PL_parser->linestr) + SvCUR(PL_parser->linestr). В конце буфера всегда находится символNUL(нулевой байт), и он не считается частью содержимого буфера. - 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
-
ПРИМЕЧАНИЕ: эта функция является экспериментальной и может быть изменена или удалена без предварительного уведомления.
Указывает на начало текущей строки внутри буфера лексического анализатора. Это полезно для указания того, в каком столбце произошла ошибка, и почти ни для чего больше. Это должно обновляться любым кодом лексического анализа, потребляющим новую строку; функция "lex_read_to" обрабатывает этот нюанс.
- 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
-
ПРИМЕЧАНИЕ: эта функция является экспериментальной и может быть изменена или удалена без предварительного уведомления.
Добавляет 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_plugin, 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 - 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()было то, чтобы код, которому необходимо узнать текущий символ валюты, разделитель десятичных знаков чисел с плавающей точкой или разделитель групп цифр, мог использовать более простой и потокобезопасный APInl_langinfoвместо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() - 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 должен быть рядом и гарантированно вызван.
void STORE_LC_NUMERIC_SET_TO_NEEDED() - 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.Возвращаемое значение — логическое: TRUE, если глобальная локаль на момент вызова была активной; и FALSE, если была активной локаль на уровне потока. Это может быть использовано вызывающей стороной, чтобы восстановить исходное состояние, чтобы определить, нужно ли вызывать
Perl_switch_to_global_locale.bool sync_locale()
Магические функции
- 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) - 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
-
УСТЕРЕЖДЁННЫЙ! В будущих версиях Perl эта функция будет удалена. Не используйте её в новом коде; удалите из существующего кода.
Возвращает длину SV в байтах, вызывая магические функции 'length', если они доступны, но не устанавливает флаг 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) - SvGETMAGIC
-
Вызывает
mg_getдля SV, если у него есть магические свойства 'get'. Например, это вызоветFETCHдля привязанной переменной. Этот макрос оценивает свой аргумент более одного раза.void SvGETMAGIC(SV* sv) - SvLOCK
-
Обеспечивает получение блокировки взаимного исключения для
sv, если соответствующий модуль загружен.void SvLOCK(SV* sv) - SvSETMAGIC
-
Вызывает
mg_setдля SV, если у него есть магические свойства 'set'. Это необходимо после изменения скаляра, если это магическая переменная, например$|, или привязанная переменная (вызываетSTORE). Этот макрос оценивает свой аргумент более одного раза.void SvSETMAGIC(SV* sv) - SvSetMagicSV
-
Как
SvSetSV, но выполняет необходимые магические операции 'set' после.void SvSetMagicSV(SV* dsv, SV* ssv) - SvSetMagicSV_nosteal
-
Как
SvSetSV_nosteal, но выполняет необходимые магические операции 'set' после.void SvSetMagicSV_nosteal(SV* dsv, SV* ssv) - SvSetSV
-
Вызывает
sv_setsv, еслиdsvне совпадает сssv. Может оценивать аргументы более одного раза. Не обрабатывает магические свойства 'set' для целевого SV.void SvSetSV(SV* dsv, SV* ssv) - SvSetSV_nosteal
-
Вызывает неразрушающую версию
sv_setsv, еслиdsvне совпадает сssv. Может оценивать аргументы более одного раза.void SvSetSV_nosteal(SV* dsv, SV* ssv) - SvSHARE
-
Обеспечивает совместное использование
svмежду потоками, если соответствующий модуль загружен.void SvSHARE(SV* sv) - sv_string_from_errnum
-
Генерирует строку сообщения, описывающую ошибку ОС, и возвращает её как SV.
errnumдолжно быть значением, котороеerrnoможет принимать, определяя тип ошибки.Если
tgtsvне равно NULL, то строка будет записана в этот SV (заменяя существующее содержимое), и он будет возвращен. Еслиtgtsvравно NULL, то строка будет записана в новый временный SV, который будет возвращен.Сообщение будет взято из локали, которая использовалась бы
$!, и будет закодировано в SV так, как это делалось бы$!. Подробности этого процесса могут быть изменены в будущем. В настоящее время сообщение по умолчанию берётся из C локали (обычно генерируя английское сообщение), и из выбранной локали, когда находится в области действияuse localepragma. Предпринимается попытка декодировать сообщение из кодировки символов локали, но оно будет декодировано только как UTF-8 или ISO-8859-1. Оно всегда корректно декодируется в UTF-8 локали, обычно в ISO-8859-1 локали и никогда в любой другой локали.SV всегда возвращает фактическую строку и без других установленных битов OK. В отличие от
$!, сообщение возвращается даже дляerrnumноль (означающее успех), и если полезное сообщение недоступно, то возвращается бесполезная строка (в настоящее время пустая).SV * sv_string_from_errnum(int errnum, SV *tgtsv) - SvUNLOCK
-
Освобождает блокировку взаимного исключения для
svесли соответствующий модуль загружен.void SvUNLOCK(SV* sv)
Управление памятью
- Copy
-
Интерфейс XSUB-генератора для C-функции
memcpy.src— это источник,dest— это место назначения,nitems— количество элементов, аtype— тип. Может потерпеть неудачу при перекрывающихся копиях. См. также"Move".void Copy(void* src, void* dest, int nitems, type) - CopyD
-
Аналогично
Copy, но возвращаетdest. Полезно для поощрения компиляторов к оптимизации хвостовой рекурсии.void * CopyD(void* src, void* dest, int nitems, type) - Move
-
Интерфейс XSUB-генератора для C-функции
memmove.src— это источник,dest— это место назначения,nitems— количество элементов, аtype— тип. Может выполнять перекрывающиеся перемещения. См. также"Copy".void Move(void* src, void* dest, int nitems, type) - MoveD
-
Аналогично
Move, но возвращаетdest. Полезно для поощрения компиляторов к оптимизации хвостовой рекурсии.void * MoveD(void* src, void* dest, int nitems, type) - Newx
-
Интерфейс 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) - Newxc
-
Интерфейс XSUB-генератора для C-функции
mallocс приведением типов. См. также"Newx".Память, полученная с помощью этой функции, ТОЛЬКО должна быть освобождена с помощью "Safefree".
void Newxc(void* ptr, int nitems, type, cast) - Newxz
-
Интерфейс XSUB-генератора для C-функции
malloc. Выделенная память обнуляется с помощьюmemzero. См. также"Newx".Память, полученная с помощью этой функции, ТОЛЬКО должна быть освобождена с помощью "Safefree".
void Newxz(void* ptr, int nitems, type) - 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) - Renew
-
Интерфейс XSUB-генератора для C-функции
realloc.Память, полученная с помощью этой функции, ТОЛЬКО должна быть освобождена с помощью "Safefree".
void Renew(void* ptr, int nitems, type) - Renewc
-
Интерфейс XSUB-генератора для C-функции
reallocс приведением типов.Память, полученная с помощью этой функции, ТОЛЬКО должна быть освобождена с помощью "Safefree".
void Renewc(void* ptr, int nitems, type, cast) - Safefree
-
Интерфейс XSUB-генератора для C-функции
free.Используется ТОЛЬКО с памятью, полученной с помощью "Newx" и связанных функций.
void Safefree(void* ptr) - savepv
-
Perl-версия
strdup(). Возвращает указатель на выделенную строку, являющуюся дубликатомpv. Размер строки определяетсяstrlen(), что означает, что она может не содержать вложенныхNULсимволов и должна иметь заключительныйNULсимвол. Выделенную память для новой строки можно освободить с помощью функцииSafefree().На некоторых платформах, например, Windows, вся выделенная память, принадлежащая потоку, освобождается при завершении этого потока. Поэтому, если вам нужно, чтобы этого не происходило, вы должны использовать функции совместного использования памяти, такие как
"savesharedpv".char* savepv(const char* pv) - savepvn
-
Perl-версия того, что было бы
strndup(), если бы оно существовало. Возвращает указатель на выделенную строку, являющуюся дубликатом первыхlenбайтов изpv, плюс заключительныйNULбайт. Выделенную память для новой строки можно освободить с помощью функцииSafefree().На некоторых платформах, например, Windows, вся выделенная память, принадлежащая потоку, освобождается при завершении этого потока. Поэтому, если вам нужно, чтобы этого не происходило, вы должны использовать функции совместного использования памяти, такие как
"savesharedpvn".char* savepvn(const char* pv, I32 len) - savepvs
-
Аналогично
savepvn, но принимает строку-литерал вместо пары строка/длина.char* savepvs("literal string" s) -
Версия
savepv(), которая выделяет дублированную строку в памяти, которая разделятся между потоками.char* savesharedpv(const char* pv) -
Версия
savepvn(), которая выделяет дублированную строку в памяти, которая разделятся между потоками. (С конкретным отличием, что указательNULLне является приемлемым)char* savesharedpvn(const char *const pv, const STRLEN len) -
Версия
savepvs(), которая выделяет дублированную строку в памяти, которая разделятся между потоками.char* savesharedpvs("literal string" s) -
Версия
savesharedpv(), которая выделяет дублированную строку в памяти, которая разделятся между потоками.char* savesharedsvpv(SV *sv) - savesvpv
-
Версия
savepv()/savepvn(), которая получает строку для дублирования из переданного SV, используяSvPV().На некоторых платформах, например, Windows, вся выделенная память, принадлежащая потоку, освобождается при завершении этого потока. Поэтому, если вам нужно, чтобы этого не происходило, вы должны использовать функции совместного использования памяти, такие как
"savesharedsvpv".char* savesvpv(SV* sv) - StructCopy
-
Это независимая от архитектуры макрокоманда для копирования одной структуры в другую.
void StructCopy(type *src, type *dest, type) - Zero
-
Интерфейс XSUB-генератора для C-функции
memzero.dest— это место назначения,nitems— количество элементов, аtype— тип.void Zero(void* dest, int nitems, type) - ZeroD
-
Аналогично
Zero, но возвращает dest. Полезно для поощрения компиляторов к оптимизации хвостовой рекурсии.void * ZeroD(void* dest, int nitems, type)
Функции прочего назначения
- dump_c_backtrace
-
Выводит C-стек вызовов в заданный
fp.Возвращает true, если стек вызовов был получен, и false в противном случае.
bool dump_c_backtrace(PerlIO* fp, int max_depth, int skip) - 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) - foldEQ_locale
-
Возвращает true, если ведущие
lenбайты строкs1иs2совпадают без учета регистра в текущем локали; в противном случае — false.I32 foldEQ_locale(const char* a, const char* b, I32 len) - form
-
Принимает шаблон форматирования в стиле sprintf и обычные (не SV) аргументы и возвращает отформатированную строку.
(char *) Perl_form(pTHX_ const char* pat, ...)может использоваться в любом месте, где требуется строка (char *):
char * s = Perl_form("%d.%d",major,minor);Использует единственный внутренний буфер, поэтому если вы хотите отформатировать несколько строк, вам необходимо явно скопировать предыдущие строки (и освободить копии, когда вы закончите).
char* form(const char* pat, ...) - getcwd_sv
-
Заполнить
svтекущим каталогомint getcwd_sv(SV* sv) - get_c_backtrace_dump
-
Возвращает SV, содержащий дамп
depthкадров стека вызовов, пропускаяskipвнутренних кадров. Обычно достаточноdepth20.Присоединенный вывод выглядит так:
... 1 10e004812:0082 Perl_croak util.c:1716 /usr/bin/perl 2 10df8d6d2:1d72 perl_parse perl.c:3975 /usr/bin/perl ...
Поля разделены табуляцией. Первый столбец — глубина (нулевой — самый внутренний не пропущенный кадр). В hex:offset, hex — положение счётчика команд в
S_parse_body, а :offset (может отсутствовать) — смещение внутриS_parse_body.util.c:1716— файл исходного кода и номер строки./usr/bin/perl — очевидно (надеюсь).
Неизвестные —
"-". Неизвестные могут возникнуть довольно легко: если платформа не поддерживает получение информации; если в двоичном файле отсутствуют отладочные данные; если оптимизатор преобразовывает код, например, с помощью встраивания.SV* get_c_backtrace_dump(int max_depth, int skip) - 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) - is_safe_syscall
-
Проверяет, что заданный
pvне содержит внутреннихNULсимволов. Если содержит, установитеerrnoвENOENT, необязательно предупредите и верните FALSE.Возвращает TRUE, если имя безопасно.
Используется макросом
IS_SAFE_SYSCALL().bool is_safe_syscall(const char *pv, STRLEN len, const char *what, const char *op_name) - memEQ
-
Сравнивает два буфера (которые могут содержать встроенные
NULсимволы), чтобы проверить, равны ли они. Параметрlenуказывает количество байтов для сравнения. Возвращает ноль, если равны, или ненулевое значение, если не равны.bool memEQ(char* s1, char* s2, STRLEN len) - memNE
-
Проверяет, не равны ли два буфера (которые могут содержать встроенные
NULсимволы). Параметрlenуказывает количество байтов для сравнения. Возвращает ноль, если не равны, или ненулевое значение, если равны.bool memNE(char* s1, char* s2, STRLEN len) - mess
-
Принимает шаблон форматирования в стиле sprintf и список аргументов. Используются для создания строкового сообщения. Если сообщение не заканчивается символом новой строки, то к нему будет добавлено указание текущего местоположения в коде, как описано для "mess_sv".
Обычно полученное сообщение возвращается в новом смертельном SV. Во время глобального уничтожения один SV может быть общим для нескольких вызовов этой функции.
SV * mess(const char *pat, ...) - mess_sv
-
Расширяет сообщение, предназначенное для пользователя, включая указание текущего местоположения в коде, если сообщение не кажется полным.
basemsg— исходное сообщение или объект. Если это ссылка, она будет использована как есть и станет результатом этой функции. В противном случае она используется как строка, и если она уже заканчивается символом новой строки, считается полной, и результат этой функции будет той же строкой. Если сообщение не заканчивается символом новой строки, то добавляется фрагмент, такой какat foo.pl line 37, и, возможно, другие фрагменты, указывающие текущее состояние выполнения. Результирующее сообщение будет заканчиваться точкой и символом новой строки.Обычно полученное сообщение возвращается в новом смертельном SV. Во время глобального уничтожения один SV может быть общим для нескольких вызовов этой функции. Если
consumeравно true, функция может (но не обязана) изменить и вернутьbasemsgвместо выделения нового SV.SV * mess_sv(SV *basemsg, bool consume) - my_snprintf
-
Функциональность C-библиотеки
snprintf, если доступна и соответствует стандарту (используетvsnprintf, на самом деле). Однако, еслиvsnprintfнедоступна, к сожалению, будет использоваться небезопасная функцияvsprintf, которая может переполнить буфер (есть проверка переполнения, но она может быть слишком поздней). Рассмотрите использованиеsv_vcatpvfвместо этого или получениеvsnprintf.int my_snprintf(char *buffer, const Size_t len, const char *format, ...) - my_strlcat
-
Функция C-библиотеки
strlcat, если доступна, или реализация в Perl. Работает со строками C, завершёнными нулём.my_strlcat()добавляет строкуsrcв конецdst. Она добавит не болееsize - strlen(dst) - 1символов. Затем она завершит строку нулём, еслиsizeравно 0 или исходная строкаdstбыла длиннееsize(на практике это не должно произойти, так как это означает, чтоsizeневерна или чтоdstне является правильно завершённой нулём строкой).Обратите внимание, что
size— это полный размер целевого буфера, и результат гарантированно завершается нулём, если есть место. Обратите внимание, что место дляNULдолжно быть включено вsize.Значение возврата — общая длина, которую имела бы
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, но не если типы кодирования отличаются.
char * ninstr(char * big, char * bigend, char * little, char * little_end) - PERL_SYS_INIT
-
Обеспечивает настройку среды выполнения C, специфичную для системы, необходимую для запуска интерпретаторов Perl. Вызывать только один раз, до создания интерпретаторов Perl.
void PERL_SYS_INIT(int *argc, char*** argv) - PERL_SYS_INIT3
-
Обеспечивает настройку среды выполнения C, специфичную для системы, необходимую для запуска интерпретаторов Perl. Вызывать следует только один раз, перед созданием любых интерпретаторов Perl.
void PERL_SYS_INIT3(int *argc, char*** argv, char*** env) - PERL_SYS_TERM
-
Обеспечивает очистку среды выполнения C, специфичную для системы, после завершения работы интерпретаторов Perl. Вызывать следует только один раз, после освобождения всех оставшихся интерпретаторов Perl.
void PERL_SYS_TERM() - quadmath_format_needed
-
quadmath_format_needed()возвращает true, если строкаformat, похоже, содержит по крайней мере один спецификатор формата%[efgaEFGA], не имеющий префикса Q, или false в противном случае.Обнаружение спецификаторов формата не является полным распознаванием синтаксиса printf, но оно должно обрабатывать большинство распространённых случаев.
Если возвращается true, то эти аргументы должны теоретически быть обработаны с помощью
quadmath_snprintf(), но в случае наличия более одного такого спецификатора формата (см. "quadmath_format_single") и наличия чего-либо помимо этого одного (даже одного байта), они не могут быть обработаны, так какquadmath_snprintf()очень строг, принимая только один спецификатор формата и ничего больше. В этом случае код, вероятно, должен завершиться ошибкой.bool quadmath_format_needed(const char* format) - quadmath_format_single
-
quadmath_snprintf()очень строг относительно своей строковойformatи вернёт -1, если формат некорректен. Он принимает ровно один спецификатор формата.quadmath_format_single()проверяет, что указанный одиночный спецификатор выглядит разумно: начинается с%, содержит только один%, заканчивается на[efgaEFGA], и содержитQперед ним. Это не полная проверка синтаксиса printf, а только основы.Возвращает формат, если он корректен, NULL — если нет.
quadmath_format_single()может и будет фактически исправлять недостающиеQ, если это необходимо. В этом случае он вернёт изменённую копию формата, которую вызывающая сторона должна освободить.См. также "quadmath_format_needed".
const char* quadmath_format_single(const char* format) - READ_XDIGIT
-
Возвращает значение шестнадцатеричной цифры в формате ASCII и перемещает указатель строки. Поведение определено корректно только при выполнении условия isXDIGIT(*str).
U8 READ_XDIGIT(char str*) - rninstr
-
Аналогично
"ninstr", но вместо этого находит последнее (крайнее справа) вхождение последовательности байтов в другой последовательности, возвращаяNULLесли такое вхождение отсутствует.char * rninstr(char * big, char * bigend, char * little, char * little_end) - 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) - strLE
-
Сравнивает две строки, завершённые
NUL, чтобы определить, меньше ли или равна первой строка,s1, второй,s2. Возвращает true или false.bool strLE(char* s1, char* s2) - 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) - sv_destroyable
-
Заглушка, которая сообщает, что объект может быть уничтожен при отсутствии модуля совместного использования. Она игнорирует свой единственный аргумент SV и возвращает 'true'. Существует для избежания проверки указателя функции
NULLи предотвращения предупреждений при определённом уровне строгости.bool sv_destroyable(SV *sv) - sv_nosharing
-
Заглушка, которая "обменивает" SV при отсутствии модуля совместного использования. Или "блокирует" его. Или "разблокирует" его. Другими словами, она игнорирует свой единственный аргумент SV. Существует для избежания проверки указателя функции
NULLи предотвращения предупреждений при определённом уровне строгости.void sv_nosharing(SV *sv) - vmess
-
patиargs— это шаблон формата в стиле sprintf и переданный список аргументов соответственно. Они используются для создания строкового сообщения. Если сообщение не заканчивается символом новой строки, оно будет дополнено указанием текущей позиции в коде, как описано для "mess_sv".Обычно полученное сообщение возвращается в новом смертном SV. Во время глобального уничтожения один SV может быть общим для разных вызовов этой функции.
SV * vmess(const char *pat, va_list *args)
Функции MRO
Эти функции связаны с порядком разрешения методов в классах Perl.
- mro_get_linear_isa
-
Возвращает линейную иерархию MRO для заданного хранилища. По умолчанию это будет то, что возвращает
mro_get_linear_isa_dfs, если для хранилища не установлен другой порядок MRO. Возвращаемое значение — AV* для чтения.Вы несете ответственность за
SvREFCNT_inc()возвращаемого значения, если планируете его хранить (иначе оно может быть удалено при следующем обновлении кеша).AV* mro_get_linear_isa(HV* stash) - 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. Подробности см. в perlmroapi.
void mro_register(const struct mro_alg *mro)
Функции Multicall
- dMULTICALL
-
Объявляет локальные переменные для multicall. См. "LIGHTWEIGHT CALLBACKS" в perlcall.
dMULTICALL; - MULTICALL
-
Создаёт лёгкий обратный вызов. См. "LIGHTWEIGHT CALLBACKS" в perlcall.
MULTICALL; - POP_MULTICALL
-
Закрывающая скобка для лёгкого обратного вызова. См. "LIGHTWEIGHT CALLBACKS" в perlcall.
POP_MULTICALL; - PUSH_MULTICALL
-
Открывающая скобка для лёгкого обратного вызова. См. "LIGHTWEIGHT CALLBACKS" в perlcall.
PUSH_MULTICALL;
Функции работы с числами
- grok_bin
-
преобразует строку, представляющую двоичное число, в числовой вид.
При входе
startи*lenзадают строку для сканирования,*flagsзадаёт флаги преобразования, аresultдолжно бытьNULLили указателем на NV. Сканирование завершается в конце строки или при первом недопустимом символе. ЕслиPERL_SCAN_SILENT_ILLDIGITне установлен в*flags, обнаружение недопустимого символа также вызовет предупреждение. При возвращении*lenустанавливается в длину просканированной строки, а*flagsзадаёт флаги вывода.Если значение меньше или равно
UV_MAX, оно возвращается как UV, флаги вывода сбрасываются, и ничего не записывается в*result. Если значение большеUV_MAX,grok_binвозвращаетUV_MAX, устанавливаетPERL_SCAN_GREATER_THAN_UV_MAXво флагах вывода и записывает значение в*result(или значение отбрасывается, если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. Сканирование завершается в конце строки или при первом недопустимом символе. ЕслиPERL_SCAN_SILENT_ILLDIGITне установлен в*flags, обнаружение недопустимого символа также вызовет предупреждение. При возвращении*lenустанавливается в длину просканированной строки, а*flagsзадаёт флаги вывода.Если значение меньше или равно
UV_MAX, оно возвращается как UV, флаги вывода сбрасываются, и ничего не записывается в*result. Если значение большеUV_MAX,grok_hexвозвращаетUV_MAX, устанавливаетPERL_SCAN_GREATER_THAN_UV_MAXво флагах вывода и записывает значение в*result(или значение отбрасывается, если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не устанавливается, если использовалась запись с обозначением степени или число больше, чем 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
-
Сканирование и пропуск числового десятичного разделителя (радикса).
bool grok_numeric_radix(const char **sp, const char *send) - grok_oct
-
преобразует строку, представляющую восьмеричное число, в числовой вид.
При входе
startи*lenзадают строку для сканирования,*flagsзадаёт флаги преобразования, аresultдолжно бытьNULLили указателем на NV. Сканирование завершается в конце строки или при первом недопустимом символе. ЕслиPERL_SCAN_SILENT_ILLDIGITне установлен в*flags, обнаружение 8 или 9 также вызовет предупреждение. При возвращении*lenустанавливается в длину просканированной строки, а*flagsзадаёт флаги вывода.Если значение меньше или равно
UV_MAX, оно возвращается как UV, флаги вывода сбрасываются, и ничего не записывается в*result. Если значение большеUV_MAX,grok_octвозвращаетUV_MAX, устанавливаетPERL_SCAN_GREATER_THAN_UV_MAXво флагах вывода и записывает значение в*result(или значение отбрасывается, еслиresultравноNULL).Если
PERL_SCAN_ALLOW_UNDERSCORESустановлен в*flags, то восьмеричное число может использовать символы"_"для разделения цифр.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) - Perl_signbit
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Возвращает ненулевое целое число, если бит знака в NV установлен, и 0, если нет.
Если Configure обнаруживает, что система имеет
signbit(), которая будет работать с нашими NV, то мы просто используем её через#defineв perl.h. В противном случае используем данную реализацию. Основное применение этой функции — отслеживание-0.0.Configureпримечания: Эта функция называется'Perl_signbit'вместо простой'signbit', потому что легко представить систему с функцией или макросомsignbit(), которая не работает с нашими конкретными NV. Мы не должны просто переименовывать#definesignbitкакPerl_signbitи ожидать, что стандартные заголовки будут счастливы. Кроме того, это функция без контекста (безpTHX_), потому чтоPerl_signbit()обычно переопределяется в perl.h как просто макровызов системной функцииsignbit(). Пользователи всегда должны вызыватьPerl_signbit().int Perl_signbit(NV f) - 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)
Функции устаревшей обратной совместимости
Некоторые из них также устарели. Вы можете исключить их из вашей компилируемой Perl, добавив этот параметр к Configure: -Accflags='-DNO_MATHOMS'
- custom_op_desc
-
Возвращает описание заданного пользовательского оператора. Раньше использовалось макросом
OP_DESC, но больше не используется: сохранено только для совместимости и не рекомендуется к применению.const char * custom_op_desc(const OP *o) - custom_op_name
-
Возвращает имя заданного пользовательского оператора. Раньше использовалось макросом
OP_NAME, но больше не используется: сохранено только для совместимости и не рекомендуется к применению.const char * custom_op_name(const OP *o) - gv_fetchmethod
-
См. "gv_fetchmethod_autoload".
GV* gv_fetchmethod(HV* stash, const char* name) - 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".
STRLEN is_utf8_char_buf(const U8 *buf, const U8 *buf_end) - pack_cat
-
Движок, реализующий функцию
pack()Perl. Примечание: параметры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) - pad_compname_type
-
Определяет тип лексической переменной в позиции
poв текущем пакете компиляции. Если переменная типизирована, возвращается хранилище класса, к которому она типизирована. В противном случае возвращаетсяNULL.HV * pad_compname_type(PADOFFSET po) - sv_2pvbyte_nolen
-
Возвращает указатель на байтовое представление SV. Может привести к понижению SV с UTF-8 в качестве побочного эффекта.
Обычно обращается через макрос
SvPVbyte_nolen.char* sv_2pvbyte_nolen(SV* sv) - sv_2pvutf8_nolen
-
Возвращает указатель на UTF-8 представление SV. Может привести к повышению SV до UTF-8 в качестве побочного эффекта.
Обычно обращается через макрос
SvPVutf8_nolen.char* sv_2pvutf8_nolen(SV* sv) - sv_2pv_nolen
-
Как
sv_2pv(), но не возвращает длину. Обычно следует использовать макрос-обёрткуSvPV_nolen(sv).char* sv_2pv_nolen(SV* sv) - sv_catpvn_mg
-
Как
sv_catpvn, но также обрабатывает магию 'set'.void sv_catpvn_mg(SV *sv, const char *ptr, STRLEN len) - sv_catsv_mg
-
Как
sv_catsv, но также обрабатывает магию 'set'.void sv_catsv_mg(SV *dsv, SV *ssv) - sv_force_normal
-
Отменяет различные виды фальсификаций в SV: если PV является общей строкой, создаётся частная копия; если мы являемся ссылкой, ссылка прекращается; если мы являемся глобальной переменной, происходит понижение до
xpvmg. См. также"sv_force_normal_flags".void sv_force_normal(SV *sv) - sv_iv
-
Внутренняя реализация макроса
SvIVxдля компиляторов, которые не могут справиться со сложными выражениями макроса. Всегда используйте макрос вместо этого.IV sv_iv(SV* sv) - sv_nolocking
-
Программный дублёр, который "закрывает" SV, когда модуль блокировки отсутствует. Существует для предотвращения проверки на указатель функции
NULLи потому что он может потенциально выдавать предупреждения при определённом уровне строгости."Заменён" на
sv_nosharing().void sv_nolocking(SV *sv) - sv_nounlocking
-
Программный дублёр, который "открывает" SV, когда модуль блокировки отсутствует. Существует для предотвращения проверки на указатель функции
NULLи потому что он может потенциально выдавать предупреждения при определённом уровне строгости."Заменён" на
sv_nosharing().void sv_nounlocking(SV *sv) - sv_nv
-
Внутренняя реализация макроса
SvNVxдля компиляторов, которые не могут справиться со сложными выражениями макроса. Всегда используйте макрос вместо этого.NV sv_nv(SV* sv) - sv_pv
-
Используйте макрос
SvPV_nolenвместо этого.char* sv_pv(SV *sv) - sv_pvbyte
-
Используйте
SvPVbyte_nolenвместо этого.char* sv_pvbyte(SV *sv) - sv_pvbyten
-
Внутренняя реализация макроса
SvPVbyteдля компиляторов, которые не могут справиться со сложными выражениями макроса. Всегда используйте макрос вместо этого.char* sv_pvbyten(SV *sv, STRLEN *lp) - sv_pvn
-
Внутренняя реализация макроса
SvPVдля компиляторов, которые не могут справиться со сложными выражениями макроса. Всегда используйте макрос вместо этого.char* sv_pvn(SV *sv, STRLEN *lp) - sv_pvutf8
-
Используйте макрос
SvPVutf8_nolenвместо этого.char* sv_pvutf8(SV *sv) - sv_pvutf8n
-
Внутренняя реализация макроса
SvPVutf8для компиляторов, которые не могут справиться со сложными выражениями макроса. Всегда используйте макрос вместо этого.char* sv_pvutf8n(SV *sv, STRLEN *lp) - sv_taint
-
Пометить SV. Используйте
SvTAINTED_onвместо этого.void sv_taint(SV* sv) - sv_unref
-
Снимает статус RV у SV и уменьшает счётчик ссылок того, на что указывает RV. Можно рассматривать как обратное действие
newSVrv. Этоsv_unref_flagsсо значениемflagравным нулю. См."SvROK_off".void sv_unref(SV* sv) - sv_usepvn
-
Указывает SV использовать
ptrдля поиска значения строки. Реализуется вызовомsv_usepvn_flagsсо значениемflagsравным 0, следовательно, не обрабатывает магию 'set'. См."sv_usepvn_flags".void sv_usepvn(SV* sv, char* ptr, STRLEN len) - sv_usepvn_mg
-
Как
sv_usepvn, но также обрабатывает магию 'set'.void sv_usepvn_mg(SV *sv, char *ptr, STRLEN len) - sv_uv
-
Внутренняя реализация макроса
SvUVxдля компиляторов, которые не могут справиться со сложными выражениями макроса. Всегда используйте макрос вместо этого.UV sv_uv(SV* sv) - unpack_str
-
Движок, реализующий функцию
unpack()Perl. Примечание: параметры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) - utf8_to_uvuni
-
УСТАРЕВШАЯ функция! Планируется удалить из будущих релизов Perl. Не использовать в новом коде; удалить из существующего.
Возвращает код Юникода первого символа в строке
s, которая предполагается в кодировке UTF-8;retlenбудет установлено в длину этого символа в байтах.Некоторые, но не все, ошибки UTF-8 обнаруживаются, и, фактически, некоторые ошибки ввода могут привести к чтению за пределами буфера ввода, что является одной из причин устаревания этой функции. Другая причина в том, что только в крайне ограниченных случаях код Юникода по сравнению с кодом исходной кодировки должен вас интересовать. См. "utf8_to_uvuni_buf" для альтернатив.
Если
sуказывает на одну из обнаруженных ошибок, а предупреждения UTF8 включены, возвращается ноль, и*retlenустанавливается (еслиretlenне указывает на NULL) на -1. Если эти предупреждения выключены, вычисленный код (или ЗАМЕЩАЮЩИЙ СИМВОЛ ЮНИКОДА, если нет) молча возвращается, и*retlenустанавливается (еслиretlenне NULL), таким образом, (s+*retlen) является следующей возможной позицией вs, которая может начинать не ошибочный символ. См. "utf8n_to_uvchr" для деталей о том, когда возвращается ЗАМЕЩАЮЩИЙ СИМВОЛ ЮНИКОДА.UV utf8_to_uvuni(const U8 *s, STRLEN *retlen)
Дерево построения Optree
- 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) - 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) - newDEFSVOP
-
Создаёт и возвращает оператор для доступа к
$_.OP * newDEFSVOP() - newFOROP
-
Создаёт, проверяет и возвращает дерево операторов, выражающее цикл
foreach(итерацию по списку значений). Это цикл с высокой производительностью, имеющий структуру, позволяющую завершить цикл с помощьюlastи т.п.svнеобязательно предоставляет переменную, которая будет привязана к каждому элементу по очереди; если null, она по умолчанию$_.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 type, 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 *first) - 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 type, 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 *listval) - newSTATEOP
-
Создаёт операцию состояния (COP). Операция состояния обычно является операцией
nextstate, но будет операциейdbstateесли отладка включена для текущего компилируемого кода. Операция состояния заполняется изPL_curcop(илиPL_compiling). Еслиlabelне равно null, он предоставляет имя метки для добавления к операции состояния; эта функция принимает на себя ответственность за память, на которую указываетlabel, и освободит её.flagsпредоставляет восемь битовop_flagsдля операции состояния.Если
oравно null, возвращается операция состояния. В противном случае операция состояния объединяется сoв операцию спискаlineseq, которая возвращается.oпотребляется этой функцией и становится частью возвращённого дерева операций.OP * newSTATEOP(I32 flags, char *label, OP *o) - newSVOP
-
Создаёт, проверяет и возвращает операцию любого типа, которая включает встроенный SV.
type— это код операции.flagsпредоставляет восемь битовop_flags.svпредоставляет SV для встраивания в операцию; эта функция принимает на себя ответственность за одну ссылку на него.OP * newSVOP(I32 type, I32 flags, SV *sv) - 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предоставляет блок, который будет выполнен, если проверка вернёт true; они потребляются этой функцией и становятся частью сконструированного дерева операций.condбудет интерпретироваться DWIM, часто как сравнение с$_, и может быть равно null для создания блокаdefault.OP * newWHENOP(OP *cond, OP *block) - newWHILEOP
-
Создаёт, проверяет и возвращает дерево операций, выражающее цикл
while. Это цикл высокого уровня, с конструкцией, позволяющей выйти из цикла с помощьюlastи тому подобного.loop— это необязательная предварительно сконструированная операцияenterloopдля использования в цикле; если она равна null, будет построена соответствующая операция автоматически.exprпредоставляет управляющее выражение цикла.blockпредоставляет основное тело цикла, аcontнеобязательно предоставляет блокcontinue, который работает как вторая половина тела. Все эти входные данные optree потребляются этой функцией и становятся частью сконструированного дерева операций.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)
Функции манипулирования Optree
- alloccopstash
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Доступна только в многопоточных сборках, эта функция выделяет запись в
PL_stashpadдля стека, переданного ей.PADOFFSET alloccopstash(HV *hv) - 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) - newCONSTSUB
-
Ведёт себя как "newCONSTSUB_flags", за исключением того, что
nameимеет нуль-терминатор, а не указанную длину, и флаги не установлены. (Это означает, чтоnameвсегда интерпретируется как Latin-1.)CV * newCONSTSUB(HV *stash, const char *name, SV *sv) - newCONSTSUB_flags
-
Создайте подпрограмму-константу, выполнив также некоторые сопутствующие задачи. Скалярная подпрограмма с постоянным значением может быть включена во время компиляции, а в Perl-коде может быть создана с помощью
sub FOO () { 123 }. Другие виды подпрограмм-констант обрабатываются по-другому.У подпрограммы будет пустой прототип, и она будет игнорировать любые аргументы при вызове. Ее поведение как константы определяется
sv. Еслиsvравно null, подпрограмма вернет пустой список. Еслиsvуказывает на скаляр, подпрограмма всегда вернет этот скаляр. Еслиsvуказывает на массив, подпрограмма всегда вернет список элементов этого массива в контексте списка или количество элементов в массиве в скалярном контексте. Эта функция берет на себя одно учтённое обращение к скаляру или массиву и обеспечит существование объекта до тех пор, пока существует подпрограмма. Еслиsvуказывает на скаляр, то при внедрении предполагается, что значение скаляра никогда не изменится, поэтому вызывающая сторона должна гарантировать, что скаляр впоследствии не будет изменен. Еслиsvуказывает на массив, то такое предположение не делается, поэтому, по сути, безопасно изменять массив или его элементы, но подтверждено ли это на самом деле, не определено.У подпрограммы будет
CvFILEустановлено в соответствии сPL_curcop. Другие аспекты подпрограммы останутся по умолчанию. Вызывающая сторона свободно может изменить подпрограмму после возврата этой функции.Если
nameравно null, то подпрограмма будет анонимной, и ееCvGVбудет ссылаться на__ANON__глобал. Еслиnameне равно null, подпрограмма будет именоваться соответствующим образом, ссылаясь на соответствующий глобал.name— это строка длинойlenбайт, представляющая имя символа без сигила в кодировке UTF-8, еслиflagsимеет установленный битSVf_UTF8, и в кодировке Latin-1 в противном случае. Имя может быть квалифицированным или неквалифицированным. Если имя неквалифицированное, оно по умолчанию находится в стеке, указанном вstash, если оно не null, или вPL_curstash, еслиstashравно null. Символ всегда добавляется в стек, если необходимо, с семантикойGV_ADDMULTI.flagsне должно иметь установленных битов, кромеSVf_UTF8.Если уже существует подпрограмма с указанным именем, новая подпрограмма заменит существующую в глобеле. Может быть сгенерировано предупреждение о переопределении.
Если у подпрограммы есть одно из нескольких специальных имен, таких как
BEGINилиEND, то она будет взята соответствующей очередью для автоматического запуска подпрограмм, связанных с фазой. В этом случае соответствующий глобал останется пустым, даже если он содержал подпрограмму ранее. Выполнение подпрограммы, вероятно, будет пустым действием, еслиsvбыл связанным массивом или вызывающая сторона изменила подпрограмму каким-то интересным образом перед ее выполнением. В случаеBEGIN, обработка имеет ошибку: подпрограмма будет выполнена при ее частичном построении и может быть удалена преждевременно, что может привести к сбоям.Функция возвращает указатель на созданную подпрограмму. Если подпрограмма анонимная, то владение одним учтённым обращением к подпрограмме передаётся вызывающей стороне. Если подпрограмма именованная, то вызывающая сторона не получает владение ссылкой. Во многих таких случаях, где подпрограмма имеет имя, отличное от фазы, подпрограмма будет существовать в момент возврата ввиду ее включения в глобал, который ее называет. Подпрограмма, имеющая имя фазы, обычно существует благодаря ссылке, принадлежащей очереди автоматического запуска фазы. Подпрограмма
BEGINможет быть уничтожена к моменту возврата этой функции, но в этом случае в настоящее время возникают ошибки до того, как вызывающая сторона получает контроль. Вызывающая сторона несет ответственность за обеспечение понимания того, какая из этих ситуаций применима.CV * newCONSTSUB_flags(HV *stash, const char *name, STRLEN len, U32 flags, SV *sv) - newXS
-
Используется
xsubppдля подключения XSUB-ов как Perl-подпрограмм.filenameдолжна храниться статически, поскольку она используется непосредственно как CvFILE(), без создания копии. - 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-структур она использует. Для основных операций в настоящее время эта функция получает информацию из
PL_opargs, которая не всегда точно отражает используемый тип; начиная с версии 5.26, см. также функцию"op_class", которая может лучше определить используемый тип.Для пользовательских операций тип возвращается из регистрации, и регистрируемый должен гарантировать, что он точен. Возвращаемое значение будет одним из констант
OA_* из op.h.U32 OP_CLASS(OP *o) - op_contextualize
-
Применяет синтаксический контекст к дереву операций, представляющему выражение.
o— это дерево операций, аcontextдолжен бытьG_SCALAR,G_ARRAY, или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 type, I32 flags, OP *o) - OP_DESC
-
Возвращает краткое описание предоставленной операции.
const char * OP_DESC(OP *o) - op_free
-
Освобождает операцию. Используйте это только тогда, когда операция больше не связана с каким-либо деревом операций.
void op_free(OP *o) - OpHAS_SIBLING
-
Возвращает true, если
oимеет братаbool OpHAS_SIBLING(OP *o) - OpLASTSIB_set
-
Помечает
oкак не имеющую последующих братьев. В сборкахPERL_OP_PARENTпомечает 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
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Распространяет контекст "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не равным null. Для более высокого уровня интерфейса см."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_type; для пользовательских операций — из op_ppaddr.
const char * OP_NAME(OP *o) - op_null
-
Обнуляет операцию, когда она больше не нужна, но все еще связана с другими операциями.
void op_null(OP *o) - op_parent
-
Возвращает родительскую операцию
o, если она есть. В противном случае возвращаетNULL. Эта функция доступна только в сборках Perl с-DPERL_OP_PARENT.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
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Оборачивает дерево операций дополнительными операциями, чтобы во время выполнения создать динамический контекст. Исходные операции выполняются в новом динамическом контексте, а затем, если они завершаются нормально, контекст восстанавливается. Дополнительные операции, используемые для создания и восстановления динамического контекста, обычно являются парой
enter/leave, но операцияscopeможет быть использована вместо этого, если операции достаточно просты, чтобы не нуждаться в полной структуре динамического контекста.OP * op_scope(OP *o)
- OpSIBLING
-
Возвращает следующего брата узла
o, илиNULLесли такого брата нетOP* OpSIBLING(OP *o) - op_sibling_splice
-
Общая функция для редактирования структуры существующей цепочки узлов op_sibling. По аналогии с функцией
splice()на уровне Perl, позволяет удалить ноль или более последовательных узлов, заменив их нулём или более разными узлами. Выполняет необходимые операции оп_первый/оп_последний для родительского узла и манипуляции оп_брат для дочерних узлов. Последний удалённый узел будет помечен как последний узел путём обновления поля op_sibling/op_sibparent или op_moresib соответственно.Обратите внимание, что op_next не изменяется, и узлы не освобождаются; это ответственность вызывающей стороны. Также не будет создан новый список оп для пустого списка и т. д.; для этого используйте функции более высокого уровня, такие как op_append_elem().
parentявляется родительским узлом цепочки братьев. Он может быть передан какNULL, если вставка не затрагивает первый или последний узел цепочки.startявляется узлом, предшествующим первому узлу, подлежащему вставке. Узел(ы) за ним будут удалены, а ops будут вставлены после него. Если этоNULL, то удаляются все узлы, начиная с первого, и узлы вставляются в начало.del_count— это количество узлов для удаления. Если ноль, узлы не удаляются. Если -1 или больше или равно числу оставшихся дочерних узлов, удаляются все оставшиеся дочерние узлы.insert— это первый из цепочки узлов, которые будут вставлены вместо удалённых узлов. ЕслиNULL, узлы не вставляются.Возвращается начало цепочки удалённых ops или
NULL, если ops не были удалены.Например:
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) - rv2cv_op_cv
-
Рассматривает op, который ожидается, что он определит подпрограмму во время выполнения, и пытается определить во время компиляции, какую подпрограмму он определяет. Это обычно используется во время компиляции Perl для определения того, может ли прототип быть применён к вызову функции.
cvop— это рассматриваемый op, обычно oprv2cv. Возвращается указатель на идентифицированную подпрограмму, если она может быть определена статически, и возвращается нулевой указатель, если это невозможно определить статически.В настоящее время подпрограмму можно определить статически, если RV, на котором должен работать
rv2cv, предоставляется подходящим opgvилиconst. Opgvподходит, если слот CV в GV заполнен. Opconstподходит, если константа должна быть RV, указывающим на CV. Подробности этого процесса могут измениться в будущих версиях Perl. Если у oprv2cvустановлен флагOPpENTERSUB_AMPER, то попытка определить подпрограмму статически не предпринимается: этот флаг используется для подавления магических действий во время компиляции при вызове подпрограммы, принуждая использовать поведение по умолчанию во время выполнения.Если у
flagsустановлен битRV2CVOPCV_MARK_EARLY, то обработка ссылки GV изменяется. Если был просмотрен GV и его слот CV оказался пустым, то у opgvустановлен флагOPpEARLY_CV. Если op не оптимизирован, а слот CV позже заполнен подпрограммой с прототипом, этот флаг в конечном итоге вызывает предупреждение "вызов произошёл слишком рано для проверки прототипа".Если у
flagsустановлен битRV2CVOPCV_RETURN_NAME_GV, то вместо возврата указателя на подпрограмму возвращается указатель на GV, дающий наиболее подходящее имя подпрограмме в данном контексте. Обычно это простоCvGVподпрограммы, но для анонимной (CvANON) подпрограммы, на которую ссылаются через GV, это будет ссылающийся GV. РезультирующийGV*приводится к типуCV*для возврата. Нулевой указатель возвращается как обычно, если статически определяемая подпрограмма отсутствует.CV * rv2cv_op_cv(OP *cvop, U32 flags)
Упаковщики и распаковщики
- packlist
-
Двигатель, реализующий функцию Perl
pack().void packlist(SV *cat, const char *pat, const char *patend, SV **beglist, SV **endlist) - 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)
Структуры данных заполнителя
- CvPADLIST
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
CV могут иметь CvPADLIST(cv) установленным на указатель на PADLIST. Это рабочая область CV, которая хранит лексические переменные и временные значения кода, а также значения для каждого потока.
Для этих целей «форматы» являются разновидностью CV; eval"" тоже (кроме того, что они не вызываемы по желанию и всегда удаляются после завершения выполнения eval""). Требуемые файлы — это просто eval без внешней лексической области.
XSUB не имеют
CvPADLIST.dXSTARGизвлекает значения изPL_curpad, но это на самом деле рабочая область вызывающей стороны (слот которой выделяется при каждом вызове entersub). Не получайте и не устанавливайтеCvPADLIST, если CV является XSUB (как определяетсяCvISXSUB()), слотCvPADLISTиспользуется для другой внутренней цели в XSUB.PADLIST имеет массив C, в котором хранятся блоки.
Нулевой элемент PADLIST — это PADNAMELIST, который представляет «имена», или скорее «статическую информацию о типе» для лексических переменных. Отдельные элементы PADNAMELIST — это PADNAME. В будущих рефакторингах PADNAMELIST может перестать храниться в массиве PADLIST, поэтому не полагайтесь на него. См. «PadlistNAMES».
Элемент CvDEPTH PADLIST — это PAD (AV), который является кадровой частью стека на этой глубине рекурсии в CV. Нулевой слот кадрового AV — это AV, который является
@_. Другие элементы — это хранилища для переменных и целевых операторов.Итерация по PADNAMELIST итерирует по всем возможным элементам блока. Слот блока для целевых объектов (
SVs_PADTMP) и GVs получают имена &PL_padname_undef, а для констант —&PL_padname_constимена (см."pad_alloc"). Использование&PL_padname_undefи&PL_padname_constявляется реализационной деталью и может быть изменено. Для проверки используйте!PadnamePV(name)иPadnamePV(name) && !PadnameLEN(name), соответственно.Только переменные слотов
my/ourполучают действительные имена. Остальные — это целевые операторы/GVs/константы, которые статически выделены или разрешены во время компиляции. У них нет имён, по которым их можно найти из кода Perl во время выполнения через eval"", так как переменныеmy/ourмогут. Поскольку их нельзя найти по «имени», а только по их индексу, назначенному во время компиляции (обычно вPL_op->op_targ), выделение SV для имени для них не имеет смысла.Имена блоков в 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 на лексическую переменную из «вне». Такие записи иногда называют «поддельными». В этом случае имя не использует «low» и «high» для хранения диапазона cop_seq, поскольку оно находится в области действия на всём протяжении. Вместо этого «high» хранит некоторые флаги, содержащие информацию о реальной лексической переменной (объявлена ли она в анонимной функции и может ли она быть создана несколько раз?), а для поддельных анонимных функций «low» содержит индекс в блоке родителя, где хранится значение лексической переменной, чтобы ускорить клонирование.Если «имя» равно
&, соответствующий элемент в блоке — это 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("literal string" name, U32 flags, HV *typestash, HV *ourstash) - PadARRAY
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Массив C записей блока.
SV ** PadARRAY(PAD pad) - pad_findmy_pvs
-
Точно так же, как «pad_findmy_pvn», но принимает строку вместо пары «строка/длина».
PADOFFSET pad_findmy_pvs("literal string" name, U32 flags) - PadlistARRAY
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Массив C списка блоков, содержащий блоки. Индексируйте его только числами ≥ 1, так как нулевой элемент не гарантируется останется пригодным к использованию.
PAD ** PadlistARRAY(PADLIST padlist) - PadlistMAX
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Индекс последнего выделенного места в списке блоков. Обратите внимание, что последний блок может быть в более раннем слоте. Любые записи после него будут
NULLв этом случае.SSize_t PadlistMAX(PADLIST padlist) - PadlistNAMES
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Имена, связанные с записями блока.
PADNAMELIST * PadlistNAMES(PADLIST padlist) - PadlistNAMESARRAY
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Массив C имён блоков.
PADNAME ** PadlistNAMESARRAY(PADLIST padlist) - PadlistNAMESMAX
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Индекс последнего имени блока.
SSize_t PadlistNAMESMAX(PADLIST padlist) - PadlistREFCNT
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Счётчик ссылок списка блоков. В настоящее время он всегда равен 1.
U32 PadlistREFCNT(PADLIST padlist) - PadMAX
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Индекс последней записи блока.
SSize_t PadMAX(PAD pad) - PadnameLEN
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Длина имени.
STRLEN PadnameLEN(PADNAME pn) - PadnamelistARRAY
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Массив C имён блоков.
PADNAME ** PadnamelistARRAY(PADNAMELIST pnl) - PadnamelistMAX
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Индекс последнего имени блока.
SSize_t PadnamelistMAX(PADNAMELIST pnl) - PadnamelistREFCNT
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Счётчик ссылок списка имён блоков.
SSize_t PadnamelistREFCNT(PADNAMELIST pnl) - PadnamelistREFCNT_dec
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Уменьшает счётчик ссылок списка имён блоков.
void PadnamelistREFCNT_dec(PADNAMELIST pnl) - PadnamePV
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Имя, хранящееся в структуре имени блока. Возвращает
NULLдля целевого слота.char * PadnamePV(PADNAME pn) - PadnameREFCNT
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Счётчик ссылок имени блока.
SSize_t PadnameREFCNT(PADNAME pn) - PadnameREFCNT_dec
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Уменьшает счётчик ссылок имени блока.
void PadnameREFCNT_dec(PADNAME pn) - PadnameSV
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Возвращает имя блока как временный SV.
SV * PadnameSV(PADNAME pn) - PadnameUTF8
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Является ли PadnamePV в UTF-8. В настоящее время это всегда true.
bool PadnameUTF8(PADNAME pn) - pad_new
-
Создаёт новый список блоков, обновляя глобальные переменные, указывающие на текущий список блоков компиляции, на новый список блоков. Следующие флаги можно объединить с помощью операции OR:
padnew_CLONE this pad is for a cloned CV padnew_SAVE save old globals on the save stack padnew_SAVESUB also save extra stuff for start of sub PADLIST * pad_new(int flags) - PL_comppad
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Во время компиляции указывает на массив, содержащий значения части блока для текущего компилируемого кода. (Во время выполнения CV может иметь множество таких массивов значений; во время компиляции создаётся только один.) Во время выполнения указывает на массив, содержащий текущие значения для блока текущего исполняемого кода.
- PL_comppad_name
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Во время компиляции указывает на массив, содержащий имена части блока для текущего компилируемого кода.
- PL_curpad
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Указывает непосредственно на тело массива «PL_comppad». (То есть, это
PadARRAY(PL_comppad).)
Переменные интерпретатора
- PL_modglobal
-
PL_modglobal— это глобальная переменная интерпретатора общего назначения, предназначенная для использования расширениями, которым необходимо хранить информацию на основе каждого интерпретатора. В крайнем случае, её можно использовать в качестве таблицы символов для расширений, чтобы обмениваться данными между собой. Рекомендуется использовать ключи, префикс которых соответствует имени пакета расширения, владеющего данными.HV* PL_modglobal - PL_na
-
Вспомогательная переменная, обычно используемая с
SvPV, когда неважно, какой длины строка. Обычно более эффективно объявить локальную переменную и использовать её вместо этого или использовать макросSvPV_nolen.STRLEN PL_na - PL_opfreehook
-
Если не
NULL, функция, на которую указывает эта переменная, будет вызываться каждый раз, когда OP освобождается, со соответствующим OP в качестве аргумента. Это позволяет расширениям освобождать любые дополнительные атрибуты, которые они локально прикрепили к OP. Гарантируется, что сначала будет вызвано освобождение для родительского OP, а затем для его потомков.При замене этой переменной рекомендуется сохранить потенциально ранее установленный обработчик и вызвать его внутри собственной функции.
Perl_ophook_t PL_opfreehook - PL_peepp
-
Указатель на оптимизатор песочницы для каждой подпрограммы. Это функция, которая вызывается в конце компиляции подпрограммы Perl (или эквивалентного независимого фрагмента кода Perl) для выполнения исправлений некоторых операций и небольших оптимизаций. Функция вызывается один раз для каждой компилируемой подпрограммы и получает в качестве единственного параметра указатель на оператор, являющийся точкой входа в подпрограмму. Она изменяет дерево операторов непосредственно.
Оптимизатор песочницы никогда не следует полностью заменять. Вместо этого добавьте код в него, обернув существующий оптимизатор. Основной способ сделать это показан в "Compile pass 3: peephole optimization" в perlguts. Если новый код хочет работать с операторами на всех уровнях структуры подпрограммы, а не только на верхнем, то, скорее всего, удобнее обернуть обработчик "PL_rpeepp".
peep_t PL_peepp - PL_rpeepp
-
Указатель на рекурсивный оптимизатор песочницы. Это функция, которая вызывается в конце компиляции подпрограммы Perl (или эквивалентного независимого фрагмента кода Perl) для выполнения исправлений некоторых операций и небольших оптимизаций. Функция вызывается один раз для каждой цепочки операций, связанных через поля
op_next; она рекурсивно вызывается для обработки каждой боковой цепочки. Ей передаётся в качестве единственного параметра указатель на оператор, который находится в начале цепочки. Она изменяет дерево операторов непосредственно.Оптимизатор песочницы никогда не следует полностью заменять. Вместо этого добавьте код в него, обернув существующий оптимизатор. Основной способ сделать это показан в "Compile pass 3: peephole optimization" в perlguts. Если новый код хочет работать только с операторами на верхнем уровне подпрограммы, а не по всей структуре, то, скорее всего, удобнее обернуть обработчик "PL_peepp".
peep_t PL_rpeepp - PL_sv_no
-
Это
falseSV. См."PL_sv_yes". Всегда ссылайтесь на это как на&PL_sv_no.SV PL_sv_no - PL_sv_undef
-
Это
undefSV. Всегда ссылайтесь на это как на&PL_sv_undef.SV PL_sv_undef - PL_sv_yes
-
Это
trueSV. См."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
Функции REGEXP
- 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;NULLбудет возвращено, если REGEXP* не найден.REGEXP * SvRX(SV *sv) - SvRXOK
-
Возвращает булево значение, указывающее, является ли SV (или SV, на который он ссылается) REGEXP.
Если вы хотите что-то сделать с REGEXP* позже, используйте SvRX и проверьте на NULL.
bool SvRXOK(SV* sv)
Макросы для работы со стеком
- dMARK
-
Объявляет переменную маркера стека,
mark, для XSUB. См."MARK"и"dORIGMARK".dMARK; - dORIGMARK
-
Сохраняет исходную метку стека для XSUB. См.
"ORIGMARK".dORIGMARK; - dSP
-
Объявляет локальную копию указателя стека Perl для XSUB, доступную через макрос
SP. См."SP".dSP; - 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) - ORIGMARK
-
Исходная метка стека для XSUB. См.
"dORIGMARK". - 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
-
Извлекает целое число типа unsigned 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; - SP
-
Указатель стека. Обычно обрабатывается
xsubpp. См."dSP"иSPAGAIN. - SPAGAIN
-
Перезагрузка указателя стека. Используется после обратного вызова. См. perlcall.
SPAGAIN; - 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) - 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
-
Возвращает double из 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
-
Поместить double в указанную позицию
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_mYES
-
Поместить
&PL_sv_yesв указанную позициюposна стеке.void XST_mYES(int pos)
Выделение памяти для тела SV
- looks_like_number
-
Проверка, похож ли контент SV на число (или является числом).
InfиInfinityобрабатываются как числа (поэтому предупреждение о нечисловом значении не выдаётся), даже если вашatof()их не распознаёт. Get-magic игнорируется.I32 looks_like_number(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()заменяет более старуюNEWSV()API и опускает первый параметр, 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) - newSVpv
-
Создаёт новый SV и копирует в него строку (которая может содержать
NUL(\0) символы). Счётчик ссылок SV устанавливается в 1. Еслиlenравно нулю, Perl вычисляет длину с помощьюstrlen(), (что означает, что если вы используете этот вариант, тоsне может содержать вложенныхNULсимволов и должен иметь завершающийNULбайт).Эта функция может привести к проблемам с надёжностью, если вы вероятнее всего передадите пустые строки, которые не завершены нулём, так как она будет выполнять strlen для строки и потенциально выходить за пределы допустимой памяти.
Использование "newSVpvn" — более безопасная альтернатива для строк, не завершённых
NUL. Для строковых литералов используйте "newSVpvs" вместо этого. Эта функция будет работать нормально для строк, завершённыхNUL, но если вы хотите избежать условия, вызывающегоstrlen, используйтеnewSVpvnвместо этого (вызываяstrlenсамостоятельно).SV* newSVpv(const char *const s, const STRLEN len) - newSVpvf
-
Создаёт новый SV и инициализирует его строкой, отформатированной как
sv_catpvf.SV* newSVpvf(const char *const pat, ...) - newSVpvn
-
Создаёт новый SV и копирует в него строку, которая может содержать
NULсимволы (\0) и другие двоичные данные. Счётчик ссылок SV устанавливается в 1. Обратите внимание, что еслиlenравно нулю, Perl создаст строку нулевой длины (Perl). Вы несете ответственность за обеспечение того, что исходный буфер имеет длину не менееlenбайт. Если параметрsравен 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) - newSVpvs
-
Подобно
newSVpvn, но принимает строковый литерал вместо пары строка/длина.SV* newSVpvs("literal string" s) - newSVpvs_flags
-
Подобно
newSVpvn_flags, но принимает строковый литерал вместо пары строка/длина.SV* newSVpvs_flags("literal string" s, U32 flags) -
Подобно
newSVpvn_share, но принимает строку, завершённуюNUL, вместо пары строка/длина.SV* newSVpv_share(const char* s, U32 hash) -
Подобно
newSVpvn_share, но принимает строковый литерал вместо пары строка/длина и опускает параметр хеша.SV* newSVpvs_share("literal string" s) - newSVrv
-
Создаёт новый SV для существующего RV,
rv, на который он должен указывать. Еслиrvне является RV, то он будет преобразован в него. Еслиclassnameне равен null, новый SV будет благословлён в указанном пакете. Новый SV возвращается и его счётчик ссылок равен 1. Счётчик ссылок 1 принадлежитrv.SV* newSVrv(SV *const rv, const char *const classname) - newSVsv
-
Создаёт новый SV, являющийся точной копией исходного SV. (Использует
sv_setsv.)SV* newSVsv(SV *const old) - newSV_type
-
Создаёт новый SV, заданного типа. Счётчик ссылок нового SV устанавливается в 1.
SV* newSV_type(const svtype type) - newSVuv
-
Создаёт новый SV и копирует в него целое беззнаковое число. Счётчик ссылок SV устанавливается в 1.
SV* newSVuv(const UV u) - sv_2bool
-
Этот макрос используется только
sv_true()или его макро-эквивалентом, и только если аргумент последнего не равенSvPOK,SvIOKилиSvNOK. Вызываетsv_2bool_flagsс флагомSV_GMAGIC.bool sv_2bool(SV *const sv) - sv_2bool_flags
-
Эта функция используется только
sv_true()и аналогичными функциями, и только если аргумент последней не равенSvPOK,SvIOKилиSvNOK. Если флаги содержатSV_GMAGIC, то сначала выполняетсяmg_get().bool sv_2bool_flags(SV *sv, I32 flags) - 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, если это строка.
'Get' magic игнорируется для
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_2pvbyte
-
Возвращает указатель на байтовое представление SV и устанавливает
*lpв его длину. Может привести к понижению SV с UTF-8 в качестве побочного эффекта.Обычно используется через макрос
SvPVbyte.char* sv_2pvbyte(SV *sv, STRLEN *const lp) - sv_2pvutf8
-
Возвращает указатель на UTF-8-кодированное представление SV и устанавливает
*lpв его длину. Может привести к повышению SV до UTF-8 в качестве побочного эффекта.Обычно используется через макрос
SvPVutf8.char* sv_2pvutf8(SV *sv, STRLEN *const lp) - sv_2pv_flags
-
Возвращает указатель на строковое значение SV и устанавливает
*lpв его длину. Если флаги имеют битSV_GMAGIC, то сначала выполняетсяmg_get(). Преобразуетsvв строку, если необходимо. Обычно вызывается через макросSvPV_flags.sv_2pv()иsv_2pv_nomgобычно также попадают сюда.char* sv_2pv_flags(SV *const sv, STRLEN *const lp, const I32 flags) - sv_2uv_flags
-
Возвращает целое беззнаковое значение SV, выполняя необходимые преобразования строк. Если
flagsимеет битSV_GMAGIC, то сначала выполняетсяmg_get(). Обычно используется через макросыSvUV(sv)иSvUVx(sv).UV sv_2uv_flags(SV *const sv, const I32 flags) - sv_backoff
-
Удалить любой смещение строки. Обычно следует использовать макрос-обёртку
SvOOK_off.void sv_backoff(SV *const sv) - sv_bless
-
Блаженствует SV в указанный пакет. SV должен быть RV. Пакет должен быть обозначен своим хранилищем (см.
"gv_stashpv"). Счётчик ссылок SV не затрагивается.SV* sv_bless(SV *const sv, HV *const stash) - sv_catpv
-
Конкатенирует
NUL-завершающую строку в конец строки, которая находится в SV. Если у SV установлен статус UTF-8, то присоединённые байты должны быть валидными UTF-8. Обрабатывает магию 'get', но не 'set'. См."sv_catpv_mg".void sv_catpv(SV *const sv, const char* ptr) - sv_catpvf
-
Обрабатывает свои аргументы так же, как
sprintf, и добавляет отформатированный вывод в SV. Как и в случае сsv_vcatpvfn, вызванной с ненулевым списком аргументов в стиле C, переупорядочение аргументов не поддерживается. Если добавленные данные содержат "широкие" символы (включая, но не ограничиваясь, SVs с UTF-8 PV, отформатированными с помощью%s, и символы >255, отформатированные с помощью%c), исходный SV может быть обновлён до UTF-8. Обрабатывает магию 'get', но не 'set'. См."sv_catpvf_mg". Если исходный SV был UTF-8, шаблон должен быть валидным UTF-8; если исходный SV был набором байтов, шаблон тоже должен быть таким.void sv_catpvf(SV *const sv, const char *const pat, ...) - sv_catpvf_mg
-
Как
sv_catpvf, но также обрабатывает магию 'set'.void sv_catpvf_mg(SV *const sv, const char *const pat, ...) - sv_catpvn
-
Конкатенирует строку в конец строки, которая находится в SV.
lenуказывает количество байтов для копирования. Если у SV установлен статус UTF-8, то присоединённые байты должны быть валидными UTF-8. Обрабатывает магию 'get', но не 'set'. См."sv_catpvn_mg".void sv_catpvn(SV *dsv, const char *sstr, STRLEN len) - sv_catpvn_flags
-
Конкатенирует строку в конец строки, которая находится в SV.
lenуказывает количество байтов для копирования.По умолчанию, предполагается, что присоединённая строка является валидным UTF-8, если у SV установлен статус UTF-8, и строкой байтов в противном случае. Можно принудительно интерпретировать присоединённую строку как UTF-8, передав флаг
SV_CATUTF8, и как набор байтов, передав флагSV_CATBYTES; SV или присоединённая строка будут обновлены до UTF-8 при необходимости.Если
flagsимеет установленный битSV_SMAGIC, вызоветmg_setпоdsvвпоследствии, если необходимо.sv_catpvnиsv_catpvn_nomgреализованы через эту функцию.void sv_catpvn_flags(SV *const dstr, const char *sstr, const STRLEN len, const I32 flags) - sv_catpvs
-
Как
sv_catpvn, но принимает лителальную строку вместо пары строка/длина.void sv_catpvs(SV* sv, "literal string" s) - sv_catpvs_flags
-
Как
sv_catpvn_flags, но принимает лителальную строку вместо пары строка/длина.void sv_catpvs_flags(SV* sv, "literal string" s, I32 flags) - sv_catpvs_mg
-
Как
sv_catpvn_mg, но принимает лителальную строку вместо пары строка/длина.void sv_catpvs_mg(SV* sv, "literal string" s) - sv_catpvs_nomg
-
Как
sv_catpvn_nomg, но принимает лителальную строку вместо пары строка/длина.void sv_catpvs_nomg(SV* sv, "literal string" s) - sv_catpv_flags
-
Конкатенирует
NUL-завершающую строку в конец строки, которая находится в SV. Если у SV установлен статус UTF-8, то присоединённые байты должны быть валидными UTF-8. Еслиflagsимеет установленный битSV_SMAGIC, вызоветmg_setпо изменённому SV, если необходимо.void sv_catpv_flags(SV *dstr, const char *sstr, const I32 flags) - sv_catpv_mg
-
Как
sv_catpv, но также обрабатывает магию 'set'.void sv_catpv_mg(SV *const sv, const char *const ptr) - sv_catsv
-
Конкатенирует строку из SV
ssvв конец строки в SVdsv. Еслиssvравно нулю, ничего не делает; в противном случае изменяет толькоdsv. Обрабатывает магию 'get' для обоих SV, но не 'set' магию. См."sv_catsv_mg"и"sv_catsv_nomg".void sv_catsv(SV *dstr, SV *sstr) - sv_catsv_flags
-
Конкатенирует строку из SV
ssvв конец строки в SVdsv. Еслиssvравно нулю, ничего не делает; в противном случае изменяет толькоdsv. Еслиflagsимеет установленный битSV_GMAGIC, вызоветmg_getдля обоих SV, если необходимо. Еслиflagsимеет установленный битSV_SMAGIC,mg_setбудет вызвано для изменённого SV впоследствии, если необходимо.sv_catsv,sv_catsv_nomg, иsv_catsv_mgреализованы через эту функцию.void sv_catsv_flags(SV *const dsv, SV *const ssv, const I32 flags) - 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
-
Сравнивает строки в двух SV. Возвращает -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
-
Сравнивает строки в двух SV. Возвращает -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
-
Сравнивает строки в двух SV с учётом локали. Поддерживает UTF-8 и
'use bytes', обрабатывает магию get и при необходимости приведёт свои аргументы к строкам. См. также"sv_cmp".I32 sv_cmp_locale(SV *const sv1, SV *const sv2) - sv_cmp_locale_flags
-
Сравнивает строки в двух SV с учётом локали. Поддерживает UTF-8 и
'use bytes'и при необходимости приведёт свои аргументы к строкам. Если флаги содержатSV_GMAGIC, обрабатывает магию get. См. также"sv_cmp_flags".I32 sv_cmp_locale_flags(SV *const sv1, SV *const sv2, const U32 flags) - sv_collxfrm
-
Этот вызов
sv_collxfrm_flagsс флагом SV_GMAGIC. См."sv_collxfrm_flags".char* sv_collxfrm(SV *const sv, STRLEN *const nxp) - sv_collxfrm_flags
-
Добавляет магию преобразования сортировки в SV, если её там ещё нет. Если флаги содержат
SV_GMAGIC, обрабатывает магию get.Любая переменная скалярного типа может иметь магию
PERL_MAGIC_collxfrm, содержащую скалярные данные переменной, но преобразованные в формат, позволяющий использовать обычное сравнение памяти для сравнения данных в соответствии с настройками локали.char* sv_collxfrm_flags(SV *const sv, STRLEN *const nxp, I32 const flags) - sv_copypv
-
Копирует строковое представление исходного SV в целевой SV. Автоматически выполняет все необходимые
mg_getи преобразование числовых значений в строки. Гарантирует сохранение флагаUTF8даже от перегруженных объектов. Похожа по природе наsv_2pv[_flags], но работает непосредственно со SV, а не только со строкой. В основном используетsv_2pv_flagsдля выполнения своей работы, за исключением случаев, когда это приведёт к потере UTF-8'ности PV.void sv_copypv(SV *const dsv, SV *const ssv) - sv_copypv_flags
-
Реализация
sv_copypvиsv_copypv_nomg. Вызывает магию get только если флаги имеют установленный битSV_GMAGIC.void sv_copypv_flags(SV *const dsv, SV *const ssv, const I32 flags) - sv_copypv_nomg
-
Как
sv_copypv, но не вызывает магию get предварительно.void sv_copypv_nomg(SV *const dsv, SV *const ssv) - sv_dec
-
Автоматическое уменьшение значения в SV, выполняя преобразование строки в число при необходимости. Обрабатывает магию 'get' и перегрузку операторов.
void sv_dec(SV *const sv) - sv_dec_nomg
-
Автоматическое уменьшение значения в SV, выполняя преобразование строки в число при необходимости. Обрабатывает перегрузку операторов. Пропускает обработку магии 'get'.
void sv_dec_nomg(SV *const sv) - sv_eq
-
Возвращает булево значение, указывающее, идентичны ли строки в двух SV. Поддерживает UTF-8 и
'use bytes', обрабатывает магию get и при необходимости приведёт свои аргументы к строкам.I32 sv_eq(SV* sv1, SV* sv2) - sv_eq_flags
-
Возвращает булево значение, указывающее, идентичны ли строки в двух SV. Поддерживает UTF-8 и
'use bytes'и при необходимости приведёт свои аргументы к строкам. Если флаги имеют битSV_GMAGICустановленным, то также обрабатывает магию get.I32 sv_eq_flags(SV* sv1, SV* sv2, const U32 flags) - sv_force_normal_flags
-
Отменить различные виды фальсификации на SV, где фальсификация означает "больше, чем" строка: если PV — общая строка, создайте частную копию; если мы — ссылка, прекратите ссылки; если мы — глоб, понизьте до
xpvmg; если мы — скаляр с копированием при записи, это время записи, когда мы делаем копию, и также используется локально; если это vstring, удалите магию vstring. Если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) - 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является целью слабой ссылки, то возвращается структура обратных ссылок, связанная со sv; в противном случае возвращаетсяNULL.При возвращении ненулевого результата тип возвращаемого значения имеет значение. Если это AV, то элементы AV — это слабые ссылки RV, которые указывают на этот элемент. Если это любой другой тип, то сам элемент является слабой ссылкой.
См. также
Perl_sv_add_backref(),Perl_sv_del_backref(),Perl_sv_kill_backrefs()SV* sv_get_backrefs(SV *const sv) - sv_grow
-
Расширяет буфер символов в SV. При необходимости использует
sv_unrefи обновляет SV доSVt_PV. Возвращает указатель на буфер символов. Используйте оберточную макросSvGROWвместо этого.char* sv_grow(SV *const sv, STRLEN newlen) - sv_inc
-
Автоматическое увеличение значения в SV, выполняя преобразование строки в число при необходимости. Обрабатывает магию «get» и перегрузку операторов.
void sv_inc(SV *const sv) - sv_inc_nomg
-
Автоматическое увеличение значения в SV, выполняя преобразование строки в число при необходимости. Обрабатывает перегрузку операторов. Пропускает обработку магии «get».
void sv_inc_nomg(SV *const sv) - sv_insert
-
Вставляет строку по указанному смещению/длине в SV. Аналогично функции Perl
substr(). Обрабатывает магию «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) - sv_isa
-
Возвращает логическое значение, указывающее, благословен ли SV в указанный класс. Это не проверяет подтипы; используйте
sv_derived_fromдля проверки отношения наследования.int sv_isa(SV* sv, const char *const name) - sv_isobject
-
Возвращает логическое значение, указывающее, является ли SV RV, указывающим на благословленный объект. Если SV не является RV или объект не благословлен, то это вернёт false.
int sv_isobject(SV* sv) - sv_len
-
Возвращает длину строки в SV. Обрабатывает магию и приведение типов и устанавливает флаг UTF8 соответствующим образом. См. также
"SvCUR", который даёт прямой доступ к слотуxpv_cur.STRLEN sv_len(SV *const sv) - sv_len_utf8
-
Возвращает количество символов в строке в SV, считая широкие байты UTF-8 как один символ. Обрабатывает магию и приведение типов.
STRLEN sv_len_utf8(SV *const 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больше нуля, тоsavepvnкопия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) - sv_mortalcopy
-
Создаёт новый SV, который является копией исходного SV (используя
sv_setsv). Новый SV помечается как смертный. Он будет уничтожен «вскоре», либо явным вызовомFREETMPS, либо неявным вызовом в местах, таких как границы операторов. См. также"sv_newmortal"и"sv_2mortal".SV* sv_mortalcopy(SV *const oldsv) - sv_newmortal
-
Создаёт новый нулевой SV, который является смертным. Счётчик ссылок SV устанавливается в 1. Он будет уничтожен «вскоре», либо явным вызовом
FREETMPS, либо неявным вызовом в местах, таких как границы операторов. См. также"sv_mortalcopy"и"sv_2mortal".SV* sv_newmortal() - sv_newref
-
Увеличить счётчик ссылок SV. Используйте оберточную макрос
SvREFCNT_inc()вместо этого.SV* sv_newref(SV *const 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) - sv_pvbyten_force
-
Бэкенд для макроса
SvPVbytex_force. Всегда используйте макрос вместо этого.char* sv_pvbyten_force(SV *const sv, STRLEN *const lp) - sv_pvn_force
-
Получить осмысленную строку из SV каким-то образом. Частная реализация макроса
SvPV_forceдля компиляторов, которые не могут справиться со сложными выражениями макроса. Всегда используйте макрос вместо этого.char* sv_pvn_force(SV* sv, STRLEN* lp) - 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 I32 flags) - sv_pvutf8n_force
-
Бэкенд для макроса
SvPVutf8x_force. Всегда используйте макрос вместо этого.char* sv_pvutf8n_force(SV *const sv, STRLEN *const lp) - 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) - 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_setsvили один из его многочисленных макросов-фронтов.void sv_replace(SV *const sv, SV *const nsv) - sv_reset
-
Базовая реализация функции Perl
reset. Обратите внимание, что функция на уровне perl устарела.void sv_reset(const char* s, HV *const stash) - sv_rvunweaken
-
Освободить ссылку: Снять флаг
SvWEAKREFу данного RV; удалить обратную ссылку на данный RV из массива обратных ссылок, связанных с целевым 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_setiv
-
Копирует целое число в данный SV, предварительно выполнив повышение типа, если необходимо. Не обрабатывает магию 'set'. См. также
"sv_setiv_mg".void sv_setiv(SV *const sv, const IV num) - sv_setiv_mg
-
Как
sv_setiv, но также обрабатывает магию 'set'.void sv_setiv_mg(SV *const sv, const IV i) - sv_setnv
-
Копирует двойное число в данный SV, предварительно выполнив повышение типа, если необходимо. Не обрабатывает магию 'set'. См. также
"sv_setnv_mg".void sv_setnv(SV *const sv, const NV num) - sv_setnv_mg
-
Как
sv_setnv, но также обрабатывает магию 'set'.void sv_setnv_mg(SV *const sv, const NV num) - sv_setpv
-
Копирует строку в SV. Строка должна быть завершена символом
NUL, и не содержать встроенныхNUL. Не обрабатывает магию 'set'. См."sv_setpv_mg".void sv_setpv(SV *const sv, const char *const ptr) - sv_setpvf
-
Работает как
sv_catpvf, но копирует текст в SV вместо добавления его. Не обрабатывает магию 'set'. См."sv_setpvf_mg".void sv_setpvf(SV *const sv, const char *const pat, ...) - sv_setpvf_mg
-
Как
sv_setpvf, но также обрабатывает магию 'set'.void sv_setpvf_mg(SV *const sv, const char *const pat, ...) - sv_setpviv
-
Копирует целое число в данный SV, также обновляя его строковое значение. Не обрабатывает магию 'set'. См.
"sv_setpviv_mg".void sv_setpviv(SV *const sv, const IV num) - sv_setpviv_mg
-
Как
sv_setpviv, но также обрабатывает магию 'set'.void sv_setpviv_mg(SV *const sv, const IV iv) - sv_setpvn
-
Копирует строку (возможно содержащую встроенные
NULсимволы) в SV. Параметрlenуказывает количество байтов для копирования. Если аргументptrравен NULL, SV станет неопределённым. Не обрабатывает магию 'set'. См."sv_setpvn_mg".void sv_setpvn(SV *const sv, const char *const ptr, const STRLEN len) - sv_setpvn_mg
-
Как
sv_setpvn, но также обрабатывает магию 'set'.void sv_setpvn_mg(SV *const sv, const char *const ptr, const STRLEN len) - sv_setpvs
-
Как
sv_setpvn, но принимает строковую литерал вместо пары строка/длина.void sv_setpvs(SV* sv, "literal string" s) - sv_setpvs_mg
-
Как
sv_setpvn_mg, но принимает строковую литерал вместо пары строка/длина.void sv_setpvs_mg(SV* sv, "literal string" s) - sv_setpv_bufsize
-
Устанавливает SV как строку длиной cur байт, с доступной длиной не менее len байтов. Обеспечивает наличие нулевого байта в SvEND. Возвращает указатель char * на буфер SvPV.
char * sv_setpv_bufsize(SV *const sv, const STRLEN cur, const STRLEN len) - sv_setpv_mg
-
Как
sv_setpv, но также обрабатывает магию 'set'.void sv_setpv_mg(SV *const sv, const char *const ptr) - 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("literal string" s) - 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_setsv
-
Копирует содержимое исходного SV
ssvв целевой SVdsv. Исходный SV может быть уничтожен, если он смертный, поэтому не используйте эту функцию, если исходный SV нужно переиспользовать. Не обрабатывает магию 'set' целевого SV. Вызывает магию 'get' на исходном SV. Грубо говоря, выполняет копирование по значению, уничтожая предыдущее содержимое целевого объекта.Вероятно, вы захотите использовать один из набора оберток, таких как
SvSetSV,SvSetSV_nosteal,SvSetMagicSVиSvSetMagicSV_nosteal.void sv_setsv(SV *dstr, SV *sstr) - sv_setsv_flags
-
Копирует содержимое исходного SV
ssvв целевой SVdsv. Исходный SV может быть уничтожен, если он смертный, поэтому не используйте эту функцию, если исходный SV нужно переиспользовать. Не обрабатывает магию 'set'. Грубо говоря, выполняет копирование по значению, уничтожая предыдущее содержимое целевого объекта. Если параметрflagsимеет установленный битSV_GMAGIC, будетmg_getнаssv, если это уместно, иначе нет. Если параметрflagsимеет установленный битSV_NOSTEAL, буферы временных объектов не будут украдены.sv_setsvиsv_setsv_nomgреализованы с помощью этой функции.Вероятно, вы захотите использовать один из набора оберток, таких как
SvSetSV,SvSetSV_nosteal,SvSetMagicSVиSvSetMagicSV_nosteal.Это основная функция для копирования скаляров, и большинство других функций и макросов для копирования используют эту функцию в качестве основы.
void sv_setsv_flags(SV *dstr, SV *sstr, const I32 flags) - sv_setsv_mg
-
Как
sv_setsv, но также обрабатывает магию 'set'.void sv_setsv_mg(SV *const dstr, SV *const sstr) - sv_setuv
-
Копирует беззнаковое целое число в данный SV, предварительно выполнив повышение типа, если необходимо. Не обрабатывает магию 'set'. См. также
"sv_setuv_mg".void sv_setuv(SV *const sv, const UV num) - sv_setuv_mg
-
Как
sv_setuv, но также обрабатывает магию 'set'.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) - sv_tainted
-
Проверка SV на заражённость. Используйте
SvTAINTEDвместо этого.bool sv_tainted(SV *const sv) - sv_true
-
Возвращает true, если SV имеет истинное значение по правилам Perl. Используйте макрос
SvTRUE, который может вызватьsv_true(), или использовать встроенную версию.I32 sv_true(SV *const 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_flags
-
Снимает статус RV у SV и уменьшает счётчик ссылок на то, что ссылалось RV. Можно представить как обратное действие для
newSVrv. Аргументcflagsможет содержатьSV_IMMEDIATE_UNREF, чтобы принудительно уменьшить счётчик ссылок (иначе уменьшение происходит при условии, что счётчик ссылок отличается от одного или ссылка является readonly SV). См."SvROK_off".void sv_unref_flags(SV *const ref, const U32 flags) - sv_untaint
-
Удалить заражённость у SV. Используйте
SvTAINTED_offвместо этого.void sv_untaint(SV *const sv) - sv_upgrade
-
Повысить тип SV до более сложной формы. Обычно добавляет новый тип тела SV, затем копирует как можно больше информации из старого тела. Возвращает ошибку, если SV уже в форме более сложной, чем запрошено. Обычно вы хотите использовать макрос обертки
SvUPGRADE, который проверяет тип перед вызовомsv_upgrade, и, следовательно, не возвращает ошибку. См. также"svtype".void sv_upgrade(SV *const sv, svtype new_type) - sv_usepvn_flags
-
Сообщает SV использовать
ptrдля поиска своего строкового значения. Обычно строка хранится внутри SV, но sv_usepvn позволяет SV использовать внешнюю строку.ptrдолжен указывать на память, выделенную функциейNewx. Она должна быть началомNewx-блока памяти, а не указателем на середину (следите заOOKи копированием при записи), и не должна быть из не-Newxменеджера памяти, например,malloc. Длина строки,len, должна быть указана. По умолчанию эта функцияRenew(т.е. realloc, перемещение) память, на которую указываетptr, поэтому указатель не должен освобождаться или использоваться программистом после передачи его вsv_usepvn, и ни один указатель "ниже" этого указателя (например, ptr + 1) тоже не должен использоваться.Если
flags & SV_SMAGICистинно, вызоветSvSETMAGIC. Еслиflags & SV_HAS_TRAILING_NULистинно, тоptr[len]должно бытьNUL, и realloc будет пропущено (т.е. буфер фактически на 1 байт длиннее, чемlen, и уже соответствует требованиям для хранения вSvPVX).void sv_usepvn_flags(SV *const sv, char* ptr, const STRLEN len, const U32 flags) - sv_utf8_decode
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Если PV SV является последовательностью октетов в расширенном UTF-8 Perl и содержит многобайтовый символ, флаг
SvUTF8устанавливается, чтобы он выглядел как символ. Если PV содержит только однобайтовые символы, флагSvUTF8остаётся выключенным. Проверяет PV на валидность и возвращает FALSE, если PV является недопустимым UTF-8.bool sv_utf8_decode(SV *const sv) - sv_utf8_downgrade
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Попытка преобразовать PV SV из символов в байты. Если PV содержит символ, который не помещается в байт, это преобразование завершится неудачей; в этом случае либо возвращает false, либо, если
fail_okне истинно, генерирует ошибку.Это не общий интерфейс кодирования Юникод в байты: используйте модуль
Encodeдля этого.bool sv_utf8_downgrade(SV *const sv, const bool fail_ok) - sv_utf8_encode
-
Преобразует PV SV в UTF-8, а затем отключает флаг
SvUTF8, чтобы он снова выглядел как октеты.void sv_utf8_encode(SV *const sv) - sv_utf8_upgrade
-
Преобразует PV SV в его UTF-8-кодированную форму. Принудительно приводит SV к строковому типу, если он им не является. Устанавливает флаг
SvUTF8для избежания будущих проверок валидности, даже если вся строка одинакова в UTF-8 и без него. Возвращает количество байтов в преобразованной строке.Это не общий интерфейс кодирования байтов в Юникод: используйте модуль Encode для этого.
STRLEN sv_utf8_upgrade(SV *sv) - sv_utf8_upgrade_flags
-
Преобразует PV SV в его UTF-8-кодированную форму. Принудительно приводит SV к строковому типу, если он им не является. Всегда устанавливает флаг SvUTF8 для избежания будущих проверок валидности, даже если все байты неизменны в UTF-8. Если у
flagsустановлен битSV_GMAGIC, то выполнитmg_getнадsvпри необходимости, иначе нет.Флаг
SV_FORCE_UTF8_UPGRADEтеперь игнорируется.Возвращает количество байтов в преобразованной строке.
Это не общий интерфейс кодирования байтов в Юникод: используйте модуль Encode для этого.
STRLEN sv_utf8_upgrade_flags(SV *const sv, const I32 flags) - sv_utf8_upgrade_flags_grow
-
Подобно
sv_utf8_upgrade_flags, но имеет дополнительный параметрextra, который представляет собой количество свободных неиспользуемых байтов в строкеsvпосле её возвращения. Это позволяет вызывающей стороне зарезервировать дополнительное пространство, которое она намерена заполнить, чтобы избежать дополнительных увеличений.sv_utf8_upgrade,sv_utf8_upgrade_nomg, иsv_utf8_upgrade_flagsреализованы через эту функцию.Возвращает количество байтов в преобразованной строке (без учёта дополнительных).
STRLEN sv_utf8_upgrade_flags_grow(SV *const sv, const I32 flags, STRLEN extra) - sv_utf8_upgrade_nomg
-
Подобно
sv_utf8_upgrade, но не выполняет магию надsv.STRLEN sv_utf8_upgrade_nomg(SV *sv) - sv_vcatpvf
-
Обрабатывает свои аргументы, как
sv_vcatpvfnс ненулевым списком аргументов C-стиля и добавляет отформатированный вывод к SV. Не обрабатывает магию 'set'. См."sv_vcatpvf_mg".Обычно используется через свой фронтенд
sv_catpvf.void sv_vcatpvf(SV *const sv, const char *const pat, va_list *const args) - sv_vcatpvfn
-
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) - sv_vcatpvfn_flags
-
Обрабатывает свои аргументы, как
vsprintf, и добавляет отформатированный вывод к SV. Использует массив SV, если список аргументов C-стиля отсутствует (NULL). Переупорядочение аргументов (используя спецификаторы формата, такие как%2$dили%*2$d) поддерживается только при использовании массива SV; использование списка аргументов C-стиля с строкой формата, использующей переупорядочение аргументов, вызовет исключение.При включённых проверках на заражение указывает через
maybe_tainted, являются ли результаты ненадежными (часто из-за использования локалей).Если вызвана как
sv_vcatpvfnили флаг имеет битSV_GMAGIC, вызывает магию get.Предполагает, что pat имеет ту же utf8-особенность, что и sv. Ответственность вызывающей стороны - убедиться, что это так.
Обычно используется через один из своих фронтендов
sv_vcatpvfиsv_vcatpvf_mg.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) - sv_vcatpvf_mg
-
Подобно
sv_vcatpvf, но также обрабатывает магию 'set'.Обычно используется через свой фронтенд
sv_catpvf_mg.void sv_vcatpvf_mg(SV *const sv, const char *const pat, va_list *const args) - sv_vsetpvf
-
Работает как
sv_vcatpvf, но копирует текст в SV вместо добавления. Не обрабатывает магию 'set'. См."sv_vsetpvf_mg".Обычно используется через свой фронтенд
sv_setpvf.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) - sv_vsetpvf_mg
-
Подобно
sv_vsetpvf, но также обрабатывает магию 'set'.Обычно используется через свой фронтенд
sv_setpvf_mg.void sv_vsetpvf_mg(SV *const sv, const char *const pat, va_list *const args)
Флаги SV
- SVt_INVLIST
-
Флаг типа для скаляров. См. "svtype".
- SVt_IV
-
Флаг типа для скаляров. См. "svtype".
- SVt_NULL
-
Флаг типа для скаляров. См. "svtype".
- SVt_NV
-
Флаг типа для скаляров. См. "svtype".
- SVt_PV
-
Флаг типа для скаляров. См. "svtype".
- SVt_PVAV
-
Флаг типа для массивов. См. "svtype".
- SVt_PVCV
-
Флаг типа для подпрограмм. См. "svtype".
- SVt_PVFM
-
Флаг типа для форматов. См. "svtype".
- SVt_PVGV
-
Флаг типа для typeglob. См. "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представляет собой typeglob. Если!SvFAKE(sv), то это настоящий, непереводимый typeglob. ЕслиSvFAKE(sv), то это скаляр, которому был назначен typeglob. Повторное назначение ему сделает его не typeglob.SVt_PVLVпредставляет собой скаляр, делегирующий другому скаляру за кулисами. Используется, например, для возвращаемого значенияsubstrи для привязанных элементов хэшей и массивов. Он может содержать любое скалярное значение, включая typeglob.SVt_REGEXP- для регулярных выражений.SVt_INVLIST- только для внутреннего использования ядра Perl.SVt_PVMGпредставляет собой "обычный" скаляр (не typeglob, регулярное выражение или делегат). Поскольку большинству скаляров не нужны все внутренние поля 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()для вывода сообщения об использовании для xsubscroak_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) - get_sv
-
Возвращает SV указанного Perl-скаляра.
flagsпередаются вgv_fetchpv. ЕслиGV_ADDустановлено, а Perl-переменная не существует, она будет создана. Еслиflagsравно нулю, а переменная не существует, возвращается NULL.ПРИМЕЧАНИЕ: форма perl_ этой функции устарела.
SV* get_sv(const char *name, I32 flags) - newRV_inc
-
Создаёт обёртку RV для SV. Счётчик ссылок исходного SV увеличивается.
SV* newRV_inc(SV* sv) - newSVpadname
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Создаёт новый SV, содержащий имя блока.
SV* newSVpadname(PADNAME *pn) - newSVpvn_utf8
-
Создаёт новый SV и копирует в него строку (которая может содержать
NUL(\0) символов). Еслиutf8истинно, вызываетSvUTF8_onдля нового SV. Реализовано как обёртка вокругnewSVpvn_flags.SV* newSVpvn_utf8(const char* s, STRLEN len, U32 utf8) - sv_catpvn_nomg
-
Подобно
sv_catpvnно не обрабатывает магию.void sv_catpvn_nomg(SV* sv, const char* ptr, STRLEN len) - sv_catpv_nomg
-
Подобно
sv_catpvно не обрабатывает магию.void sv_catpv_nomg(SV* sv, const char* ptr) - sv_catsv_nomg
-
Подобно
sv_catsvно не обрабатывает магию.void sv_catsv_nomg(SV* dsv, SV* ssv) - SvCUR
-
Возвращает длину строки, которая находится в SV. См.
"SvLEN".STRLEN SvCUR(SV* sv) - SvCUR_set
-
Устанавливает текущую длину строки, которая находится в SV. См.
"SvCUR"иSvIV_set>.void SvCUR_set(SV* sv, STRLEN len) - 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символ (хотя Perl-скаляры строго его не требуют). См."SvCUR". Обратитесь к символу как*(SvEND(sv)).Предупреждение: Если
SvCURравноSvLEN, тоSvENDуказывает на невыделенную память.char* SvEND(SV* sv) - SvGAMAGIC
-
Возвращает true, если SV имеет магию получения или перегрузку. Если хотя бы одно из этих значений истинно, то скаляр является активными данными и может возвращать новое значение каждый раз при обращении. Поэтому необходимо быть осторожным, чтобы читать его только один раз за логическую операцию пользователя и работать с возвращённым значением. Если ни одно из этих значений не истинно, значение скаляра не может измениться, пока оно не будет записано.
U32 SvGAMAGIC(SV* sv) - SvGROW
-
Расширяет буфер символов в SV, чтобы в нём было место для указанного количества байтов (не забудьте зарезервировать место для дополнительного заключительного
NULсимвола). Вызываетsv_growдля выполнения расширения при необходимости. Возвращает указатель на буфер символов. SV должен быть типа >=SVt_PV. Альтернативой является вызовsv_grow, если вы не уверены в типе SV.Возможно, вы ошибочно подумаете, что
len— это количество байтов, которые нужно добавить к существующему размеру, но на самом деле это общий размер, которыйsvдолжен иметь.char * SvGROW(SV* sv, STRLEN len) - 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) - SvIsCOW
-
Возвращает значение U32, указывающее, является ли SV Copy-On-Write (либо общие скаляры ключей хеша, либо полные скаляры Copy On Write, если 5.9.0 настроен для COW).
U32 SvIsCOW(SV* sv) -
Возвращает логическое значение, указывающее, является ли SV общим скаляром ключа хеша Copy-On-Write.
bool SvIsCOW_shared_hash(SV* sv) - SvIV
-
Преобразует данный SV в IV и возвращает его. В многих случаях возвращаемое значение будет храниться в слоте IV
sv, но не во всех. (Используйте"sv_setiv", чтобы убедиться в этом).См.
"SvIVx"для версии, которая гарантирует, чтоsvбудет вычислено только один раз.IV SvIV(SV* sv) - SvIV_nomg
-
Подобно
SvIVно не обрабатывает магию.IV SvIV_nomg(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) - SvIVx
-
Преобразует данный SV в IV и возвращает его. В большинстве случаев возвращаемое значение будет храниться в слоте IV
sv, но не во всех. (Используйте"sv_setiv"чтобы убедиться, что это так).Эта форма гарантирует, что
svбудет вычислено только один раз. Используйте только еслиsv— это выражение с побочными эффектами, в противном случае используйте более эффективную формуSvIV.IV SvIVx(SV* sv) - SvLEN
-
Возвращает размер буфера строки в SV, не включая часть, приписываемую
SvOOK. См."SvCUR".STRLEN SvLEN(SV* sv) - SvLEN_set
-
Устанавливает размер буфера строки для SV. См.
"SvLEN".void SvLEN_set(SV* sv, STRLEN len) - SvMAGIC_set
-
Устанавливает значение указателя MAGIC в
svна val. См."SvIV_set".void SvMAGIC_set(SV* sv, MAGIC* val) - 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) - SvNV
-
Преобразует заданный SV в NV и возвращает его. Возвращаемое значение во многих случаях будет сохранено в слоте NV
sv, но не во всех. (Используйте"sv_setnv", чтобы убедиться в этом).См.
"SvNVx", чтобы получить версию, которая гарантирует оценкуsvтолько один раз.NV SvNV(SV* sv) - SvNV_nomg
-
Аналогично
SvNV, но не обрабатывает магию.NV SvNV_nomg(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) - SvNVx
-
Преобразует заданный SV в NV и возвращает его. Возвращаемое значение во многих случаях будет сохранено в слоте NV
sv, но не во всех случаях. (Используйте"sv_setnv", чтобы убедиться в этом).Этот вариант гарантирует, что
svбудет вычислен только один раз. Используйте его только еслиsv— выражение со побочными эффектами, в противном случае используйте более эффективныйSvNV.NV SvNVx(SV* sv) - SvOK
-
Возвращает значение U32, указывающее, определено ли значение. Это имеет смысл только для скаляров.
U32 SvOK(SV* sv) - SvOOK
-
Возвращает U32, указывающее, смещён ли указатель на буфер строки. Эта хитрость используется внутри для ускорения удаления символов из начала
SvPV. КогдаSvOOKистинно, начало выделенного буфера строки фактически наSvOOK_offset()байт раньшеSvPVX. Это смещение раньше хранилось вSvIVX, но сейчас хранится в свободном фрагменте буфера.U32 SvOOK(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 строку символов. Проверяет приватный флаг. Используйте
SvPOKвместо этого.U32 SvPOKp(SV* sv) - SvPV
-
Возвращает указатель на строку в SV или строковое представление SV, если SV не содержит строку. SV может кэшировать строковое представление, становясь
SvPOK. Обрабатывает магию «получения». Переменнаяlenбудет установлена в длину строки (это макрос, поэтому не используйте&len). См. также"SvPVx"для версии, которая гарантирует, чтоsvбудет вычислена только один раз.Обратите внимание, что нет гарантии, что возвращаемое значение
SvPV()равноSvPVX(sv), или чтоSvPVX(sv)содержит корректные данные, или что последовательные вызовыSvPV(sv)будут возвращать тот же указатель каждый раз. Это связано с тем, как обрабатываются такие вещи, как перегрузка и копирование при изменении. В этих случаях возвращаемое значение может указывать на временный буфер или подобное. Если вам абсолютно необходимо, чтобы полеSvPVXбыло действительным (например, если вы намерены писать в него), см."SvPV_force".char* SvPV(SV* sv, STRLEN len) - SvPVbyte
-
Аналогично
SvPV, но сначала преобразуетsvв байтовый формат, если необходимо.char* SvPVbyte(SV* sv, STRLEN len) - SvPVbyte_force
-
Аналогично
SvPV_force, но сначала преобразуетsvв байтовый формат, если необходимо.char* SvPVbyte_force(SV* sv, STRLEN len) - SvPVbyte_nolen
-
Аналогично
SvPV_nolen, но сначала преобразуетsvв байтовый формат, если необходимо.char* SvPVbyte_nolen(SV* sv) - SvPVbytex
-
Аналогично
SvPV, но сначала преобразуетsvв байтовый формат, если необходимо. Гарантирует, чтоsvбудет вычислен только один раз; в противном случае используйте более эффективныйSvPVbyte.char* SvPVbytex(SV* sv, STRLEN len) - SvPVbytex_force
-
Аналогично
SvPV_force, но сначала преобразуетsvв байтовый формат, если необходимо. Гарантирует, чтоsvбудет вычислено только один раз; в противном случае используйте более эффективныйSvPVbyte_force.char* SvPVbytex_force(SV* sv, STRLEN len) - SvPVCLEAR
-
Гарантирует, что sv — SVt_PV, что его SvCUR равен 0 и что он правильно завершается нулём. Эквивалентно sv_setpvs(""), но более эффективно.
char * SvPVCLEAR(SV* sv) - SvPV_force
-
Аналогично
SvPV, но принудительно сделает SV содержащим строку (SvPOK) и только строку (SvPOK_only) любыми способами. Вам нужен принудительный режим, если вы собираетесь обновлятьSvPVXнапрямую. Обрабатывает магию «получения».Обратите внимание, что принудительное преобразование произвольного скаляра в обычный PV может привести к удалению полезных данных. Например, если SV был
SvROK, то ссылка будет иметь декрементированный счётчик ссылок, а сам SV может быть преобразован в скаляр типаSvPOKсо строковым буфером, содержащим значение, например,"ARRAY(0x1234)".char* SvPV_force(SV* sv, STRLEN len) - SvPV_force_nomg
-
Аналогично
SvPV_force, но не обрабатывает магию «получения».char* SvPV_force_nomg(SV* sv, STRLEN len) - SvPV_nolen
-
Аналогично
SvPV, но не устанавливает переменную длины.char* SvPV_nolen(SV* sv) - SvPV_nomg
-
Аналогично
SvPV, но не обрабатывает магию.char* SvPV_nomg(SV* sv, STRLEN len) - SvPV_nomg_nolen
-
Аналогично
SvPV_nolen, но не обрабатывает магию.char* SvPV_nomg_nolen(SV* sv) - SvPV_set
-
Вероятно, это не то, что вам нужно. Возможно, вы хотели "sv_usepvn_flags" или "sv_setpvn" или "sv_setpvs".
Устанавливает значение указателя PV в
svна завершающую нулём строкуNUL, выделенную Perl'емval. См. также"SvIV_set".Не забудьте освободить предыдущий буфер PV. Есть много пунктов для проверки. Будьте осторожны, существующий указатель может быть вовлечён в копирование при изменении или других операциях, поэтому выполните
SvOOK_off(sv), и используйтеsv_force_normalилиSvPV_force(или проверьте флагSvIsCOW) в первую очередь, чтобы убедиться в безопасности этого изменения. Затем, если это не копирование при изменении, вызовитеSvPV_freeдля освобождения предыдущего буфера PV.void SvPV_set(SV* sv, char* val) - SvPVutf8
-
Аналогично
SvPV, но сначала преобразуетsvв UTF-8, если необходимо.char* SvPVutf8(SV* sv, STRLEN len) - SvPVutf8x
-
Аналогично
SvPV, но сначала преобразуетsvв UTF-8, если необходимо. Гарантирует, чтоsvбудет вычислено только один раз; в противном случае используйте более эффективныйSvPVutf8.char* SvPVutf8x(SV* sv, STRLEN len) - SvPVutf8x_force
-
Аналогично
SvPV_force, но сначала преобразуетsvв UTF-8, если необходимо. Гарантирует, чтоsvбудет вычислено только один раз; в противном случае используйте более эффективныйSvPVutf8_force.char* SvPVutf8x_force(SV* sv, STRLEN len) - SvPVutf8_force
-
Аналогично
SvPV_force, но сначала преобразуетsvв UTF-8, если необходимо.char* SvPVutf8_force(SV* sv, STRLEN len) - SvPVutf8_nolen
-
Аналогично
SvPV_nolen, но сначала преобразуетsvв UTF-8, если необходимо.char* SvPVutf8_nolen(SV* sv) - SvPVX
-
Возвращает указатель на физическую строку в SV. SV должен содержать строку. До версии 5.9.3 использовать этот макрос небезопасно, если тип SV >=
SVt_PV.Также используется для хранения имени автоматически загружаемой подпрограммы в процедуре XS AUTOLOAD. См. "Автозагрузка с XSUB" в perlguts.
char* SvPVX(SV* sv) - SvPVx
-
Вариант
SvPV, который гарантирует, чтоsvбудет вычислен только один раз. Используйте его только еслиsv— выражение со побочными эффектами, в противном случае используйте более эффективныйSvPV.char* SvPVx(SV* sv, STRLEN len) - 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) - SvREFCNT
-
Возвращает значение счётчика ссылок объекта. Доступно для кода Perl через Internals::SvREFCNT().
U32 SvREFCNT(SV* sv) - SvREFCNT_dec
-
Уменьшает счётчик ссылок данного SV.
svможет бытьNULL.void SvREFCNT_dec(SV* sv) - SvREFCNT_dec_NN
-
То же самое, что и
SvREFCNT_dec, но может быть использовано только если известно, чтоsvнеNULL. Поскольку нам не нужно проверять на NULL, это быстрее и компактнее.void SvREFCNT_dec_NN(SV* sv) - SvREFCNT_inc
-
Увеличивает счётчик ссылок данного SV, возвращая SV.
Все следующие
SvREFCNT_inc* макросы являются оптимизированными версиямиSvREFCNT_inc, и могут быть заменены наSvREFCNT_inc.SV* SvREFCNT_inc(SV* sv) - SvREFCNT_inc_NN
-
То же самое, что и
SvREFCNT_inc, но может быть использовано только если известно, чтоsvнеNULL. Поскольку нам не нужно проверять на NULL, это быстрее и компактнее.SV* SvREFCNT_inc_NN(SV* sv) - SvREFCNT_inc_simple
-
То же самое, что и
SvREFCNT_inc, но может быть использовано только с выражениями без побочных эффектов. Поскольку нам не нужно хранить временную переменную, это быстрее.SV* SvREFCNT_inc_simple(SV* sv) - SvREFCNT_inc_simple_NN
-
То же самое, что и
SvREFCNT_inc_simple, но может быть использовано только если известно, чтоsvнеNULL. Поскольку нам не нужно проверять на NULL, это быстрее и компактнее.SV* SvREFCNT_inc_simple_NN(SV* sv) - SvREFCNT_inc_simple_void
-
То же самое, что и
SvREFCNT_inc_simple, но может быть использовано только если вам не нужно значение возврата. Макрос не обязан возвращать осмысленное значение.void SvREFCNT_inc_simple_void(SV* sv) - SvREFCNT_inc_simple_void_NN
-
То же самое, что и
SvREFCNT_inc, но может быть использовано только если вам не нужно значение возврата, и известно, чтоsvнеNULL. Макрос не обязан возвращать осмысленное значение или проверять на NULL, поэтому он компактнее и быстрее.void SvREFCNT_inc_simple_void_NN(SV* sv) - SvREFCNT_inc_void
-
То же самое, что и
SvREFCNT_inc, но может быть использовано только если вам не нужно значение возврата. Макрос не обязан возвращать осмысленное значение.void SvREFCNT_inc_void(SV* sv) - SvREFCNT_inc_void_NN
-
То же самое, что и
SvREFCNT_inc, но может быть использовано только если вам не нужно значение возврата, и известно, чтоsvнеNULL. Макрос не обязан возвращать осмысленное значение или проверять на NULL, поэтому он компактнее и быстрее.void SvREFCNT_inc_void_NN(SV* sv) - sv_report_used
-
Вывести содержимое всех SV, которые ещё не освобождены (помощник для отладки).
void sv_report_used() - 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_setsv_nomg
-
Как
sv_setsv, но не обрабатывает магию.void sv_setsv_nomg(SV* dsv, SV* ssv) - SvSTASH
-
Возвращает stash SV.
HV* SvSTASH(SV* sv) - SvSTASH_set
-
Устанавливает значение указателя STASH в
svна val. См."SvIV_set".void SvSTASH_set(SV* sv, HV* val) - SvTAINT
-
Помечает SV как заражённый, если включено помечание, и если какой-то ввод в текущем выражении заражён (обычно переменная, но, возможно, и неявные вводы, такие как параметры локализации).
SvTAINTраспространяет эту заражённость на выходы выражения пессимистичным способом; т.е. не обращая внимания на то, какие именно выходы влияют на какие вводы.void SvTAINT(SV* sv) - SvTAINTED
-
Проверяет, является ли SV заражённым. Возвращает TRUE, если да, FALSE — если нет.
bool SvTAINTED(SV* sv) - SvTAINTED_off
-
Снимает пометку заражённости с SV. Будьте очень осторожны с этой процедурой, так как она обнуляет некоторые фундаментальные средства безопасности Perl. Авторы модулей XS не должны использовать эту функцию, если не полностью понимают все последствия безусловного снятия метки заражённости. Снятие метки заражённости должно выполняться стандартным способом Perl, через тщательно составленный regexp, а не непосредственным снятием метки заражённости с переменных.
void SvTAINTED_off(SV* sv) - SvTAINTED_on
-
Помечает SV как заражённый, если включено помечание.
void SvTAINTED_on(SV* sv) - SvTRUE
-
Возвращает булево значение, указывающее, расценит ли Perl SV как истинное или ложное. См.
"SvOK"для проверки определённого/неопределённого значения. Обрабатывает магию «get», если скаляр не ужеSvPOK,SvIOKилиSvNOK(публичные, а не приватные флаги).bool SvTRUE(SV* sv) - SvTRUE_nomg
-
Возвращает булево значение, указывающее, расценит ли Perl SV как истинное или ложное. См.
"SvOK"для проверки определённого/неопределённого значения. Не обрабатывает магию «get».bool SvTRUE_nomg(SV* sv) - SvTYPE
-
Возвращает тип SV. См.
"svtype".svtype SvTYPE(SV* sv) - SvUOK
-
Возвращает булево значение, указывающее, содержит ли SV целое число, которое должно быть интерпретировано как беззнаковое. Положительное целое число, значение которого находится в диапазоне как IV, так и UV, может быть помечено как
SvUOKилиSVIOK.bool SvUOK(SV* sv) - SvUPGRADE
-
Используется для повышения SV до более сложной формы. Использует
sv_upgradeдля повышения, если необходимо. См."svtype".void SvUPGRADE(SV* sv, svtype type) - SvUTF8
-
Возвращает значение U32, указывающее на статус UTF-8 SV. Если всё настроено правильно, это указывает, содержит ли SV данные, закодированные в UTF-8. Используйте это после вызова
SvPV()или одной из его разновидностей, на случай, если какой-либо вызов перегрузки строк обновит внутренний флаг.Если вы хотите учесть псевдоним bytes, используйте
"DO_UTF8"вместо этого.U32 SvUTF8(SV* sv) - sv_utf8_upgrade_nomg
-
Как
sv_utf8_upgrade, но не выполняет магию надsv.STRLEN sv_utf8_upgrade_nomg(SV *sv) - SvUTF8_off
-
Снимает статус UTF-8 SV (данные не меняются, только флаг). Не используйте бездумно.
void SvUTF8_off(SV *sv) - SvUTF8_on
-
Включает статус UTF-8 SV (данные не меняются, только флаг). Не используйте бездумно.
void SvUTF8_on(SV *sv) - SvUV
-
Преобразует данный SV в UV и возвращает его. Возвращаемое значение во многих случаях будет сохранено в слоте UV
sv, но не во всех. (Используйте"sv_setuv"чтобы убедиться, что это так).См.
"SvUVx"для версии, которая гарантирует, чтоsvбудет вычислена только один раз.UV SvUV(SV* sv) - SvUV_nomg
-
Как
SvUV, но не обрабатывает магию.UV SvUV_nomg(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) - SvUVx
-
Преобразует данный SV в UV и возвращает его. Возвращаемое значение во многих случаях будет сохранено в слоте UV
sv, но не во всех. (Используйте"sv_setuv"чтобы убедиться, что это так).Эта форма гарантирует, что
svбудет вычислена только один раз. Используйте только еслиsv— выражение с побочными эффектами, в противном случае используйте более эффективнуюSvUV.UV SvUVx(SV* sv) - SvVOK
-
Возвращает булево значение, указывающее, содержит ли SV v-строку.
bool SvVOK(SV* sv)
Поддержка Unicode
"Поддержка Unicode" в perlguts содержит введение в этот API.
См. также "Классификация символов" и "Изменение регистра символов". Различные функции вне этой секции также работают со Unicode. Поищите строку "utf8" в этом документе.
- BOM_UTF8
-
Это макрос, который вычисляет строковую константу байтов UTF-8, определяющих метку порядка байтов Unicode (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
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Преобразует потенциально закодированную в 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
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Преобразует строку
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. Определяется, насколько глубоко в строки производить сравнение, другими входными параметрами.Если
u1true, то строкаs1предполагается закодированной в UTF-8; в противном случае она предполагается в родной кодировке 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 вместо преобразования символов в верхний/нижний регистр, см. http://www.unicode.org/unicode/reports/tr21/ (Case Mappings).
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 #9; в противном случае возвращает FALSE. Еслиlenравно 0, оно будет вычислено с помощьюstrlen(s)(что означает, что если вы используете этот параметр, уsне может быть вложенныхNULсимволов и должен иметь завершающийNULбайт). Обратите внимание, что все символы ASCII составляют «корректную строку UTF-8».Эта функция возвращает FALSE для строк, содержащих какие-либо символы с кодами выше максимального значения Unicode 0x10FFFF или суррогатные символы, но принимает символы с кодами, не являющимися символами, согласно Поправке #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 #9. , которая указывала, что коды символов, не являющихся символами, просто не рекомендуются, а не полностью запрещены при открытом обмене. См. "Коды символов, не являющиеся символами" в perlunicode.Используйте
"isUTF8_CHAR"для проверки расширенного UTF-8 Perl; и"isUTF8_CHAR_flags"для более настраиваемого определения.Используйте
"is_c9strict_utf8_string","is_c9strict_utf8_string_loc", и"is_c9strict_utf8_string_loclen"для проверки целых строк.STRLEN isC9_STRICT_UTF8_CHAR(const U8 *s, const U8 *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законным Unicode-приемлемым UTF-8 для одного символа.Используйте
"isC9_STRICT_UTF8_CHAR"для использования определения допустимых кодовых значений из Поправки к Unicode #9;"isUTF8_CHAR"для проверки расширенного UTF-8 Perl; и"isUTF8_CHAR_flags"для более настраиваемого определения.Используйте
"is_strict_utf8_string","is_strict_utf8_string_loc", и"is_strict_utf8_string_loclen"для проверки целых строк.STRLEN isSTRICT_UTF8_CHAR(const U8 *s, const U8 *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_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образуют корректную строку расширенного UTF-8 Perl; в противном случае возвращает 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.Другими словами, это возвращает ИСТИНА, если
sуказывает на частичную кодовую точку, закодированную в UTF-8.Это полезно, когда проверяется буфер фиксированной длины на корректность UTF-8, но последние несколько байтов в нём не образуют полного символа; то есть, он разделён где-то посредине конечного представления кодовой точки в UTF-8. (Предполагается, что когда буфер обновляется с новым фрагментом данных, новые начальные байты завершат частичную кодовую точку.) Эта функция используется для проверки того, что последние байты в текущем буфере на самом деле являются законным началом какой-либо кодовой точки, поэтому, если это не так, об этом можно сообщить без ожидания следующего чтения.
bool is_utf8_valid_partial_char(const U8 * const s, 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". Если существует какая-либо последовательность байтов, которая может завершить частичный символ ввода таким образом, что сформируется не запрещённый символ, функция возвращает ИСТИНА; в противном случае ЛОЖЬ. Несимвольные кодовые точки не могут быть определены на основе частичного ввода символов. Но многие другие возможные исключённые типы могут быть определены только по первым одному или двум байтам.bool is_utf8_valid_partial_char_flags( const U8 * const s, const U8 * const e, const U32 flags ) - isUTF8_CHAR
-
Принимает ненулевое значение, если первые несколько байтов строки, начиная с
sи не заглядывая дальшеe - 1, представляют собой корректный UTF-8, как расширенный Perl, который представляет некоторую кодовую точку; в противном случае принимает значение 0. Если ненулевое, значение показывает, сколько байтов, начиная сs, составляют представление кодовой точки. Любые оставшиеся байты передe, но за пределами необходимых для формирования первой кодовой точки вs, не проверяются.Кодовая точка может быть любой, которая поместится в UV на этом компьютере, используя расширение Perl для официального UTF-8 для представления тех, которые выше максимального значения Unicode 0x10FFFF. Это означает, что этот макрос используется для эффективного определения, являются ли следующие несколько байтов в
sзаконным UTF-8 для одного символа.Используйте
"isSTRICT_UTF8_CHAR", чтобы ограничить допустимые кодовые точки теми, которые определены Unicode как полностью взаимозаменяемые в приложениях;"isC9_STRICT_UTF8_CHAR", чтобы использовать определение допустимых кодовых точек согласно Исправлению #9 Unicode; и"isUTF8_CHAR_flags", для более настраиваемого определения.Используйте
"is_utf8_string","is_utf8_string_loc", и"is_utf8_string_loclen", чтобы проверить целые строки.Обратите внимание, что использование кодовых точек, больших, чем может поместиться в IV, устарело. Этот макрос не генерирует никаких предупреждений для таких кодовых точек, рассматривая их как допустимые.
Обратите также внимание, что символ UTF-8 INVARIANT (то есть ASCII на не-EBCDIC машинах) является допустимым символом UTF-8.
STRLEN isUTF8_CHAR(const U8 *s, const U8 *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" для проверки целых строк.
STRLEN isUTF8_CHAR_flags(const U8 *s, const U8 *e, const U32 flags) - pv_uni_display
-
Создаёт в скаляре
dsvотображаемую версию строкиspv, длинойlen, при этом отображаемая версия не превышаетpvlimбайтов (если она длиннее, остальная часть усекается и добавляется"...").Аргумент
flagsможет иметьUNI_DISPLAY_ISPRINTустановленным для отображения символовisPRINT(), как есть,UNI_DISPLAY_BACKSLASHдля отображения\\[nrfta\\]как версий с обратным слешем (например,"\n") (UNI_DISPLAY_BACKSLASHпредпочтительнееUNI_DISPLAY_ISPRINTдля"\\").UNI_DISPLAY_QQ(и его псевдонимUNI_DISPLAY_REGEX) имеют какUNI_DISPLAY_BACKSLASH, так иUNI_DISPLAY_ISPRINTвключёнными.Возвращается указатель на 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.Возвращает ИСТИНА, если терминатор был найден, в противном случае возвращает ЛОЖЬ.
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, произойдут нежелательные действия. (См. cpan/Encode/encoding.pm и 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) - to_utf8_fold
-
УСТАРЕЛО! Планируется удалить эту функцию из будущих релизов Perl. Не используйте её в новом коде; удалите из существующего кода.
Вместо этого используйте "toFOLD_utf8_safe".
UV to_utf8_fold(const U8 *p, U8* ustrp, STRLEN *lenp) - to_utf8_lower
-
УСТАРЕЛО! Планируется удалить эту функцию из будущих релизов Perl. Не используйте её в новом коде; удалите из существующего кода.
Вместо этого используйте "toLOWER_utf8_safe".
UV to_utf8_lower(const U8 *p, U8* ustrp, STRLEN *lenp) - to_utf8_title
-
УСТАРЕЛО! Планируется удалить эту функцию из будущих релизов Perl. Не используйте её в новом коде; удалите из существующего кода.
Вместо этого используйте "toTITLE_utf8_safe".
UV to_utf8_title(const U8 *p, U8* ustrp, STRLEN *lenp) - to_utf8_upper
-
УСТАРЕЛО! Планируется удалить эту функцию из будущих релизов Perl. Не используйте её в новом коде; удалите из существующего кода.
Вместо этого используйте "toUPPER_utf8_safe".
UV to_utf8_upper(const U8 *p, U8* ustrp, STRLEN *lenp) - 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 для списка таких флагов. Даже если ошибка разрешена, эта функция, как правило, возвращает заменяющий символ Юникода при обнаружении ошибки. В utf8.h есть флаги для отмены этого поведения для ошибок с слишком длинными последовательностями, но не делайте этого, кроме очень специализированных целей.Флаг
UTF8_CHECK_ONLYпереопределяет поведение при обнаружении неразрешённой (другими флагами) ошибки. Если этот флаг установлен, процедура предполагает, что вызывающая сторона сгенерирует предупреждение, и эта функция будет молча устанавливатьretlenв-1(приведено к типуSTRLEN) и возвращать ноль.Обратите внимание, что этот API требует разграничения между успешным декодированием символа
NUL, и ошибочным возвратом (если не установлен флагUTF8_CHECK_ONLY), поскольку в обоих случаях возвращается 0, и, в зависимости от ошибки,retlenможет быть установлено в 1. Чтобы разграничить, после возврата нуля, проверьте, равен ли первый байтsнулю. Если да, вход былNUL; если нет, во входных данных была ошибка. Либо вы можете использовать"utf8n_to_uvchr_error".Некоторые кодовые точки считаются проблемными. Это суррогаты Юникода, несимволы Юникода и кодовые точки, превышающие максимальное значение Юникода 0x10FFFF. По умолчанию они считаются обычными кодовыми точками, но в определенных ситуациях требуется специальная обработка, которая может быть указана с помощью параметра
flags. ЕслиflagsсодержитUTF8_DISALLOW_ILLEGAL_INTERCHANGE, все три класса обрабатываются как ошибки и обрабатываются соответствующим образом. ФлагиUTF8_DISALLOW_SURROGATE,UTF8_DISALLOW_NONCHAR, иUTF8_DISALLOW_SUPER(означающие превышение максимального значения Юникода) могут быть установлены для запрета этих категорий индивидуально.UTF8_DISALLOW_ILLEGAL_INTERCHANGEограничивает допустимые входные данные строгим UTF-8, традиционно определенным Юникодом. Используйте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 не сможет понять файлы, написанные чем-то, использующим другое расширение. По этим причинам существует отдельный набор флагов, которые могут предупреждать и/или запрещать эти очень большие кодовые точки, даже если другие точки, превышающие Юникод, допускаются. Это флаги
UTF8_WARN_PERL_EXTENDEDиUTF8_DISALLOW_PERL_EXTENDED. Дополнительную информацию см. в "UTF8_GOT_PERL_EXTENDED". Конечно,UTF8_DISALLOW_SUPERбудет обрабатывать все кодовые точки, превышающие Юникод, включая эти, как ошибки. (Обратите внимание, что стандарт Юникода считает всё, что превышает 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 и иногда, когда присутствует также ошибка слишком длинной последовательности. Новые имена точно описывают ситуацию во всех случаях.Все другие кодовые точки, соответствующие символам Юникода, включая символы частного использования и те, которые ещё не назначены, никогда не считаются ошибочными и никогда не генерируют предупреждения.
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_OVERFLOW-
Последовательность ввода была неверной, так как она относится к кодовой точке, которая не может быть представлена в доступном количестве битов в IV на текущей платформе.
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) - utf8n_to_uvuni
-
Вместо этого используйте "utf8_to_uvchr_buf" или, в редких случаях, "utf8n_to_uvchr".
Эта функция была полезна для кода, который хотел обрабатывать как платформы EBCDIC, так и ASCII с свойствами Unicode, но начиная с Perl v5.20, различия между платформами в основном стали невидимыми для большинства кодов, поэтому эта функция, скорее всего, не то, что вам нужно. Если вам нужна именно эта функциональность, используйте
NATIVE_TO_UNI(utf8_to_uvchr_buf(...))илиNATIVE_TO_UNI(utf8n_to_uvchr(...)).UV utf8n_to_uvuni(const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags) - UTF8SKIP
-
возвращает количество байтов в кодированном UTF-8 символе, первый (возможно, единственный) байт которого указан в
s.STRLEN UTF8SKIP(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, представляющей один из кодовых точек Юникода, не являющихся символами; в противном случае возвращает 0. Если ненулевое, значение показывает количество байтов, начиная сs, которые составляют представление кодовой точки.bool UTF8_IS_NONCHAR(const U8 *s, const U8 *e) - UTF8_IS_SUPER
-
Обратите внимание, что Perl распознаёт расширение UTF-8, которое может кодировать кодовые точки, большие, чем те, которые определены Юникодом, то есть 0..0x10FFFF.
Эта макрокоманда возвращает ненулевое значение, если первые несколько байтов строки, начиная с
sи не выходя за пределыe - 1, принадлежат этому расширению UTF-8; в противном случае возвращает 0. Если ненулевое, значение показывает количество байтов, начиная сs, которые составляют представление кодовой точки.0 возвращается, если байты не образуют корректную расширенную последовательность UTF-8 или если они представляют кодовую точку, которая не может поместиться в UV на текущей платформе. Поэтому результат этой макрокоманды может быть различным при выполнении на 64-битной и 32-битной машинах.
Обратите внимание, что использование кодовых точек, больших, чем может вместить IV на текущей машине, устарело.
bool UTF8_IS_SUPER(const U8 *s, const U8 *e) - UTF8_IS_SURROGATE
-
Возвращает ненулевое значение, если первые несколько байтов строки, начиная с
sи не выходя за пределыe - 1, являются корректной последовательностью UTF-8, представляющей одну из суррогатных кодовых точек Юникода; в противном случае возвращает 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_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
-
УСТАРЕЛО! Планируется удалить эту функцию из будущих релизов Perl. Не используйте её в новом коде; удалите её из существующего кода.
Возвращает кодовую точку нативного символа первого символа в строке
s, которая предполагается закодированной в UTF-8;retlenбудет установлено в длину этого символа в байтах.Обнаружено не все, но некоторые, нарушения в кодировке UTF-8, и, по факту, некоторые некорректные данные могут привести к чтению за пределами буфера ввода, поэтому эта функция устарела. Используйте "utf8_to_uvchr_buf" вместо неё.
Если
sуказывает на одно из обнаруженных нарушений, а предупреждения UTF8 включены, возвращается ноль, и*retlenустанавливается (еслиretlenнеNULL) в -1. Если эти предупреждения выключены, вычисленное значение, если оно определено (или ЗАМЕЩАЮЩИЙ СИМВОЛ Юникода, если нет), возвращается без изменений, и*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. Если эти предупреждения выключены, вычисленное значение, если оно определено (или ЗАМЕЩАЮЩИЙ СИМВОЛ Юникода, если нет), возвращается без изменений, и*retlenустанавливается (еслиretlenнеNULL), таким образом, (s+*retlen) — это следующая возможная позиция вs, которая могла бы начать неискажённый символ. Смотрите "utf8n_to_uvchr" для подробностей о том, когда возвращается ЗАМЕЩАЮЩИЙ СИМВОЛ.UV utf8_to_uvchr_buf(const U8 *s, const U8 *send, STRLEN *retlen) - utf8_to_uvuni_buf
-
УСТАРЕЛО! Планируется удалить эту функцию из будущих релизов Perl. Не используйте её в новом коде; удалите её из существующего кода.
Только в очень редких случаях код должен иметь дело с кодовыми точками Юникода (в отличие от нативных). В этих немногих случаях используйте
NATIVE_TO_UNI(utf8_to_uvchr_buf(...))вместо. Если вы не уверены, что это один из таких случаев, то предполагайте, что это не так, и используйте простойutf8_to_uvchr_bufвместо.Возвращает кодовую точку Юникода (а не нативного) первого символа в строке
s, которая предполагается закодированной в UTF-8;sendуказывает на позицию на 1 байт дальше концаs.retlenбудет установлено в длину этого символа в байтах.Если
sне указывает на корректный символ UTF-8, а предупреждения UTF8 включены, возвращается ноль, и*retlenустанавливается (еслиretlenне NULL) в -1. Если эти предупреждения выключены, вычисленное значение, если оно определено (или ЗАМЕЩАЮЩИЙ СИМВОЛ Юникода, если нет), возвращается без изменений, и*retlenустанавливается (еслиretlenне NULL), таким образом, (s+*retlen) — это следующая возможная позиция вs, которая могла бы начать неискажённый символ. Смотрите "utf8n_to_uvchr" для подробностей о том, когда возвращается ЗАМЕЩАЮЩИЙ СИМВОЛ.UV utf8_to_uvuni_buf(const U8 *s, const U8 *send, STRLEN *retlen) - UVCHR_IS_INVARIANT
-
Возвращает 1, если представление кодовой точки
cpодинаково независимо от того, закодирована ли она в UTF-8; в противном случае возвращает 0. Неизменяемые символы UTF-8 могут копироваться без изменений при преобразовании в/из UTF-8, что экономит время.cp— это код Юникода, если значение больше 255; в противном случае это платформа-ориентированный код.bool UVCHR_IS_INVARIANT(UV cp) - UVCHR_SKIP
-
Возвращает количество байтов, необходимых для представления кодовой точки
cpпри кодировании в UTF-8.cp— это нативная (ASCII или EBCDIC) кодовая точка, если она меньше 255; в противном случае это кодовая точка Юникода.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-битном слове.Можно запретить или предупредить о кодовых точках, не являющихся Юникодом, или тех, которые могут быть проблемными, используя "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);Это осознанный Unicode способ сказать
*(d++) = uv;Если
flagsравно 0, эта функция принимает любое кодовое значение от 0 доIV_MAXв качестве входных данных.IV_MAXобычно равно 0x7FFF_FFFF в 32-битном слове.Указание
flagsможет дополнительно ограничить разрешённые значения и не выводить предупреждения, как показано ниже:Если
uv— это суррогатное кодовое значение Unicode иUNICODE_WARN_SURROGATEустановлено, функция выведет предупреждение, при условии, что предупреждения UTF8 включены. Вместо этого, еслиUNICODE_DISALLOW_SURROGATEустановлено, функция завершится с ошибкой и вернёт NULL. Если оба флага установлены, функция выведет предупреждение и вернёт NULL.Аналогично, флаги
UNICODE_WARN_NONCHARиUNICODE_DISALLOW_NONCHARвлияют на то, как функция обрабатывает несимволы Unicode.И точно так же, флаги
UNICODE_WARN_SUPERиUNICODE_DISALLOW_SUPERвлияют на обработку кодовых точек, превышающих максимальное значение Unicode 0x10FFFF. Языки, отличные от Perl, могут не поддерживать файлы, содержащие эти значения.Флаг
UNICODE_WARN_ILLEGAL_INTERCHANGEвыбирает все три вышеупомянутых флага WARN; иUNICODE_DISALLOW_ILLEGAL_INTERCHANGEвыбирает все три флага DISALLOW.UNICODE_DISALLOW_ILLEGAL_INTERCHANGEограничивает разрешённые входные данные строгим UTF-8, традиционно определённому Unicode. Аналогично,UNICODE_WARN_ILLEGAL_C9_INTERCHANGEиUNICODE_DISALLOW_ILLEGAL_C9_INTERCHANGEявляются сокращениями для выбора вышеупомянутых флагов Unicode и суррогатных, но не для несимвольных, как определено в Поправке Unicode #9. См. "Несимвольные кодовые точки" в perlunicode.Крайне высокие кодовые точки никогда не были определены в каких-либо стандартах и требуют расширения UTF-8 для выражения, что делает Perl. Вероятно, программы, написанные на чём-то кроме Perl, не смогут читать файлы, содержащие эти значения; так же, как и Perl не сможет понять файлы, написанные чем-то, использующим другое расширение. По этим причинам есть отдельный набор флагов, которые могут предупреждать и/или запрещать эти крайне высокие кодовые точки, даже если другие выше Unicode значения принимаются. Это флаги
UNICODE_WARN_PERL_EXTENDEDиUNICODE_DISALLOW_PERL_EXTENDED. Более подробную информацию см. в "UTF8_GOT_PERL_EXTENDED". Конечно,UNICODE_DISALLOW_SUPERбудет рассматривать все кодовые точки выше Unicode, включая эти, как ошибочные. (Обратите внимание, что стандарт Unicode рассматривает всё, что выше 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) - uvoffuni_to_utf8_flags
-
ЭТУ ФУНКЦИЮ СЛЕДУЕТ ИСПОЛЬЗОВАТЬ ТОЛЬКО В ОЧЕНЬ СПЕЦИАЛИЗИРОВАННЫХ СЛУЧАЯХ. Вместо этого, почти весь код должен использовать "uvchr_to_utf8" или "uvchr_to_utf8_flags".
Эта функция похожа на них, но входным значением является строгая кодовая точка Unicode (в отличие от нативной). Только в очень редких случаях код не должен использовать нативное кодовое значение.
Подробности см. в описании "uvchr_to_utf8_flags".
U8* uvoffuni_to_utf8_flags(U8 *d, UV uv, const UV flags) - uvuni_to_utf8_flags
-
Вместо этого вы, почти наверняка, захотите использовать "uvchr_to_utf8" или "uvchr_to_utf8_flags".
Эта функция — устаревший синоним для "uvoffuni_to_utf8_flags", которая сама по себе, хотя и не устарела, должна использоваться только в изолированных случаях. Эти функции были полезны для кода, который хотел обработать как EBCDIC, так и ASCII платформы с Unicode свойствами, но начиная с Perl v5.20, различия между платформами в основном стали невидимыми для большинства кода, поэтому эта функция, скорее всего, не то, что вам нужно.
U8* uvuni_to_utf8_flags(U8 *d, UV uv, UV flags) - valid_utf8_to_uvchr
-
Аналогично
"utf8_to_uvchr_buf", но вызывать её следует только тогда, когда известно, что следующий символ в входной строке UTF-8sимеет правильный формат (например, он проходит"isUTF8_CHAR"Суррогаты, несимвольные кодовые точки и не-Unicode кодовые точки разрешены.UV valid_utf8_to_uvchr(const U8 *s, STRLEN *retlen)
Переменные, созданные xsubpp и xsubpp внутренними функциями
- newXSproto
-
Используется
xsubppдля подключения XSUB как Perl-подпрограмм. Добавляет Perl прототипы к подпрограммам. - XS_APIVERSION_BOOTCHECK
-
Макрос для проверки того, что версия API perl, к которой был скомпилирован XS-модуль, соответствует версии API интерпретатора perl, в который он загружается.
XS_APIVERSION_BOOTCHECK; - XS_VERSION
-
Идентификатор версии XS-модуля. Обычно обрабатывается автоматически
ExtUtils::MakeMaker. См."XS_VERSION_BOOTCHECK". - XS_VERSION_BOOTCHECK
-
Макрос для проверки того, что переменная
$VERSIONмодуля PM соответствует переменнойXS_VERSIONXS-модуля. Обычно обрабатывается автоматическиxsubpp. См. "The VERSIONCHECK: Keyword" в perlxs.XS_VERSION_BOOTCHECK;
Предупреждения и завершение
- ckWARN
-
Возвращает булево значение, указывающее, включены ли предупреждения для категории предупреждений
w. Если категория по умолчанию включена, даже если она не находится в области действияuse warnings, используйте макрос "ckWARN_d".bool ckWARN(U32 w) - ckWARN2
-
Подобно
"ckWARN", но принимает две категории предупреждений в качестве входных данных и возвращает TRUE, если включена любая из них. Если любая категория по умолчанию включена, даже если она не находится в области действияuse warnings, используйте макрос "ckWARN2_d". Категории должны быть полностью независимыми, одна не может быть подклассом другой.bool ckWARN2(U32 w1, U32 w2) - ckWARN3
-
Подобно
"ckWARN2", но принимает три категории предупреждений в качестве входных данных и возвращает TRUE, если включена любая из них. Если любая из категорий по умолчанию включена, даже если она не находится в области действияuse warnings, используйте макрос "ckWARN3_d". Категории должны быть полностью независимыми, одна не может быть подклассом другой.bool ckWARN3(U32 w1, U32 w2, U32 w3) - ckWARN4
-
Подобно
"ckWARN3", но принимает четыре категории предупреждений в качестве входных данных и возвращает TRUE, если включена любая из них. Если любая из категорий по умолчанию включена, даже если она не находится в области действияuse warnings, используйте макрос "ckWARN4_d". Категории должны быть полностью независимыми, одна не может быть подклассом другой.bool ckWARN4(U32 w1, U32 w2, U32 w3, U32 w4) - ckWARN_d
-
Подобно
"ckWARN", но используется только в том случае, если категория предупреждений по умолчанию включена, даже если она не находится в области действияuse warnings.bool ckWARN_d(U32 w) - ckWARN2_d
-
Подобно
"ckWARN2", но используется только в том случае, если любая из категорий предупреждений по умолчанию включена, даже если она не находится в области действияuse warnings.bool ckWARN2_d(U32 w1, U32 w2) - ckWARN3_d
-
Подобно
"ckWARN3", но используется только в том случае, если любая из категорий предупреждений по умолчанию включена, даже если она не находится в области действияuse warnings.bool ckWARN3_d(U32 w1, U32 w2, U32 w3) - ckWARN4_d
-
Подобно
"ckWARN4", но используется только в том случае, если любая из категорий предупреждений по умолчанию включена, даже если она не находится в области действияuse warnings.bool ckWARN4_d(U32 w1, U32 w2, U32 w3, U32 w4) - croak
-
Это интерфейс XS к функции Perl's
die.Принимает шаблон форматирования в стиле sprintf и список аргументов. Они используются для генерации строкового сообщения. Если сообщение не заканчивается новой строкой, оно будет дополнено некоторыми указаниями текущего местоположения в коде, как описано для "mess_sv".
Сообщение об ошибке будет использоваться в качестве исключения, по умолчанию возвращая управление к ближайшему содержащему
eval, но подлежит изменению обработчиком$SIG{__DIE__}. В любом случае функцияcroakникогда не возвращается нормально.По историческим причинам, если
patравно null, содержимоеERRSV($@) будет использоваться в качестве сообщения или объекта об ошибке вместо построения сообщения об ошибке из аргументов. Если вы хотите бросить объект, отличный от строки, или построить сообщение об ошибке в самом SV, предпочтительнее использовать функцию "croak_sv", которая не включает в себя перекрытиеERRSV.void croak(const char *pat, ...) - croak_no_modify
-
Точно эквивалентно
Perl_croak(aTHX_ "%s", PL_no_modify), но генерирует более лаконичный код объекта, чем использованиеPerl_croak. Меньше кода в путях обработки исключений снижает давление на кэш процессора.void croak_no_modify() - croak_sv
-
Это интерфейс XS к функции Perl's
die.baseex— это сообщение или объект об ошибке. Если это ссылка, она будет использована как есть. В противном случае она используется как строка, и если она не заканчивается новой строкой, она будет дополнена некоторыми указаниями текущего местоположения в коде, как описано для "mess_sv".Сообщение или объект об ошибке будут использоваться в качестве исключения, по умолчанию возвращая управление к ближайшему содержащему
eval, но подлежит изменению обработчиком$SIG{__DIE__}. В любом случае функцияcroak_svникогда не возвращается нормально.Для завершения работы с простым текстовым сообщением может быть удобнее использовать функцию "croak".
void croak_sv(SV *baseex) - die
-
Ведёт себя так же, как "croak", за исключением типа возвращаемого значения. Его следует использовать только там, где требуется тип возвращаемого значения
OP *. Функция никогда фактически не возвращается.OP * die(const char *pat, ...) - die_sv
-
Ведёт себя так же, как "croak_sv", за исключением типа возвращаемого значения. Его следует использовать только там, где требуется тип возвращаемого значения
OP *. Функция никогда фактически не возвращается.OP * die_sv(SV *baseex) - vcroak
-
Это интерфейс XS к функции Perl's
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's
warn.patиargs— шаблон форматирования в стиле sprintf и инкапсулированный список аргументов. Они используются для генерации строкового сообщения. Если сообщение не заканчивается новой строкой, оно будет дополнено некоторыми указаниями текущего местоположения в коде, как описано для "mess_sv".Сообщение об ошибке или объект по умолчанию будут выводиться в стандартный поток ошибок, но это может быть изменено обработчиком
$SIG{__WARN__}.В отличие от "vcroak",
patне может быть null.void vwarn(const char *pat, va_list *args) - warn
-
Это интерфейс XS к функции Perl's
warn.Принимает шаблон форматирования в стиле sprintf и список аргументов. Они используются для генерации строкового сообщения. Если сообщение не заканчивается новой строкой, оно будет дополнено некоторыми указаниями текущего местоположения в коде, как описано для "mess_sv".
Сообщение об ошибке или объект по умолчанию будут выводиться в стандартный поток ошибок, но это может быть изменено обработчиком
$SIG{__WARN__}.В отличие от "croak",
patне может быть null.void warn(const char *pat, ...) - warn_sv
-
Это интерфейс XS к функции Perl's
warn.baseex— это сообщение или объект об ошибке. Если это ссылка, она будет использована как есть. В противном случае она используется как строка, и если она не заканчивается новой строкой, она будет дополнена некоторыми указаниями текущего местоположения в коде, как описано для "mess_sv".Сообщение или объект об ошибке по умолчанию будут выводиться в стандартный поток ошибок, но это может быть изменено обработчиком
$SIG{__WARN__}.Для вывода простого строкового сообщения удобнее использовать функцию "warn".
void warn_sv(SV *baseex)
Функции без документации
Следующие функции были помечены как часть публичного API, но в настоящее время не задокументированы. Используйте их на свой страх и риск, так как интерфейсы могут измениться. Функции, которые не указаны в этом документе, не предназначены для публичного использования и ни при каких обстоятельствах не должны использоваться.
Если вам необходимо использовать одну из этих функций, отправьте письмо по адресу perl5-porters@perl.org. Возможно, существует веская причина, по которой функция не задокументирована, и её следует удалить из этого списка; или может быть, просто никто не успел её задокументировать. В последнем случае вас попросят предоставить исправление с документацией функции. После принятия вашего исправления интерфейс будет означать, что он стабилен (если не указано иное) и может быть использован.
- GetVars
- Gv_AMupdate
- PerlIO_clearerr
- PerlIO_close
- PerlIO_context_layers
- PerlIO_eof
- PerlIO_error
- PerlIO_fileno
- PerlIO_fill
- PerlIO_flush
- PerlIO_get_base
- PerlIO_get_bufsiz
- PerlIO_get_cnt
- PerlIO_get_ptr
- PerlIO_read
- PerlIO_seek
- PerlIO_set_cnt
- PerlIO_set_ptrcnt
- PerlIO_setlinebuf
- PerlIO_stderr
- PerlIO_stdin
- PerlIO_stdout
- PerlIO_tell
- PerlIO_unread
- PerlIO_write
- _variant_byte_number
- amagic_call
- amagic_deref_call
- any_dup
- atfork_lock
- atfork_unlock
- av_arylen_p
- av_iter_p
- block_gimme
- call_atexit
- call_list
- calloc
- cast_i32
- cast_iv
- cast_ulong
- cast_uv
- ck_warner
- ck_warner_d
- ckwarn
- ckwarn_d
- clear_defarray
- clone_params_del
- clone_params_new
- croak_memory_wrap
- croak_nocontext
- csighandler
- cx_dump
- cx_dup
- cxinc
- deb
- deb_nocontext
- debop
- debprofdump
- debstack
- debstackptrs
- delimcpy
- despatch_signals
- die_nocontext
- dirp_dup
- do_aspawn
- do_binmode
- do_close
- do_gv_dump
- do_gvgv_dump
- do_hv_dump
- do_join
- do_magic_dump
- do_op_dump
- do_open
- do_open9
- do_openn
- do_pmop_dump
- do_spawn
- do_spawn_nowait
- do_sprintf
- do_sv_dump
- doing_taint
- doref
- dounwind
- dowantarray
- dump_eval
- dump_form
- dump_indent
- dump_mstats
- dump_sub
- dump_vindent
- filter_add
- filter_del
- filter_read
- foldEQ_latin1
- form_nocontext
- fp_dup
- fprintf_nocontext
- free_global_struct
- free_tmps
- get_context
- get_mstats
- get_op_descs
- get_op_names
- get_ppaddr
- get_vtbl
- gp_dup
- gp_free
- gp_ref
- gv_AVadd
- gv_HVadd
- gv_IOadd
- gv_SVadd
- gv_add_by_type
- gv_autoload4
- gv_autoload_pv
- gv_autoload_pvn
- gv_autoload_sv
- gv_check
- gv_dump
- gv_efullname
- gv_efullname3
- gv_efullname4
- gv_fetchfile
- gv_fetchfile_flags
- gv_fetchpv
- gv_fetchpvn_flags
- gv_fetchsv
- gv_fullname
- gv_fullname3
- gv_fullname4
- gv_handler
- gv_name_set
- he_dup
- hek_dup
- hv_common
- hv_common_key_len
- hv_delayfree_ent
- hv_eiter_p
- hv_eiter_set
- hv_free_ent
- hv_ksplit
- hv_name_set
- hv_placeholders_get
- hv_placeholders_set
- hv_rand_set
- hv_riter_p
- hv_riter_set
- ibcmp_utf8
- init_global_struct
- init_stacks
- init_tm
- instr
- is_lvalue_sub
- leave_scope
- load_module_nocontext
- magic_dump
- malloc
- markstack_grow
- mess_nocontext
- mfree
- mg_dup
- mg_size
- mini_mktime
- moreswitches
- mro_get_from_name
- mro_get_private_data
- mro_set_mro
- mro_set_private_data
- my_atof
- my_atof2
- my_chsize
- my_cxt_index
- my_cxt_init
- my_dirfd
- my_exit
- my_failure_exit
- my_fflush_all
- my_fork
- my_lstat
- my_pclose
- my_popen
- my_popen_list
- my_setenv
- my_socketpair
- my_stat
- my_strftime
- newANONATTRSUB
- newANONHASH
- newANONLIST
- newANONSUB
- newATTRSUB
- newAVREF
- newCVREF
- newFORM
- newGVREF
- newGVgen
- newGVgen_flags
- newHVREF
- newHVhv
- newIO
- newMYSUB
- newPROG
- newRV
- newSUB
- newSVREF
- newSVpvf_nocontext
- new_stackinfo
- op_refcnt_lock
- op_refcnt_unlock
- parser_dup
- perl_alloc_using
- perl_clone_using
- pmop_dump
- pop_scope
- pregcomp
- pregexec
- pregfree
- pregfree2
- printf_nocontext
- ptr_table_fetch
- ptr_table_free
- ptr_table_new
- ptr_table_split
- ptr_table_store
- push_scope
- re_compile
- re_dup_guts
- re_intuit_start
- re_intuit_string
- realloc
- reentrant_free
- reentrant_init
- reentrant_retry
- reentrant_size
- ref
- reg_named_buff_all
- reg_named_buff_exists
- reg_named_buff_fetch
- reg_named_buff_firstkey
- reg_named_buff_nextkey
- reg_named_buff_scalar
- regdump
- regdupe_internal
- regexec_flags
- regfree_internal
- reginitcolors
- regnext
- repeatcpy
- rsignal
- rsignal_state
- runops_debug
- runops_standard
- rvpv_dup
- safesyscalloc
- safesysfree
- safesysmalloc
- safesysrealloc
- save_I16
- save_I32
- save_I8
- save_adelete
- save_aelem
- save_aelem_flags
- save_alloc
- save_aptr
- save_ary
- save_bool
- save_clearsv
- save_delete
- save_destructor
- save_destructor_x
- save_freeop
- save_freepv
- save_freesv
- save_generic_pvref
- save_generic_svref
- save_hash
- save_hdelete
- save_helem
- save_helem_flags
- save_hints
- save_hptr
- save_int
- save_item
- save_iv
- save_list
- save_long
- save_mortalizesv
- save_nogv
- save_op
- save_padsv_and_mortalize
- save_pptr
- save_pushi32ptr
- save_pushptr
- save_pushptrptr
- save_re_context
- save_scalar
- save_set_svflags
- save_sptr
- save_svref
- save_vptr
- savestack_grow
- savestack_grow_cnt
- scan_num
- scan_vstring
- seed
- set_context
- si_dup
- ss_dup
- stack_grow
- start_subparse
- str_to_version
- sv_2iv
- sv_2pv
- sv_2uv
- sv_catpvf_mg_nocontext
- sv_catpvf_nocontext
- sv_dup
- sv_dup_inc
- sv_peek
- sv_pvn_nomg
- sv_setpvf_mg_nocontext
- sv_setpvf_nocontext
- sys_init
- sys_init3
- sys_intern_clear
- sys_intern_dup
- sys_intern_init
- sys_term
- taint_env
- taint_proper
- unlnk
- uvuni_to_utf8
- vdeb
- vform
- vload_module
- vnewSVpvf
- vwarner
- warn_nocontext
- warner
- warner_nocontext
- whichsig
- whichsig_pv
- whichsig_pvn
- whichsig_sv
Авторы
До мая 1997 года этот документ поддерживался Джеффом Окамото <okamoto@corp.hp.com>. Сейчас он поддерживается как часть самого Perl.
При большой помощи и предложениях от Дина Роэриха, Малкольма Бити, Андреаса Кенига, Пола Хадсона, Ильи Захаревича, Пола Маркесса, Нила Бауэрса, Мэтью Грина, Тима Банса, Паука Бордмана, Ульриха Пфайфера, Стивена МакКэмента и Гурусами Сарати.
Список API первоначально был составлен Дином Роэрихом <roehrich@cray.com>.
Обновление для автоматической генерации из комментариев в исходном коде сделано Бенедиктом Штуль.
См. также
perlguts, perlxs, perlxstut, perlintern
© 1993–2020 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.28.3/perlapi