perlintern
СОДЕРЖАНИЕ
- ИМЯ
- ОПИСАНИЕ
- Временные метки области видимости во время компиляции
- Пользовательские операторы
- Функции управления CV
- Счетчики ссылок CV и CvOUTSIDE
- Функции встраивания
- Функции GV
- Функции управления хешами
- Функции Ввода/Вывода
- Интерфейс лексического анализатора
- Магические функции
- Разнообразные функции
- Функции MRO
- Числовые функции
- Функции манипулирования Optree
- Структуры данных Pad
- Переменные на интерпретатор
- Макросы управления стеком
- Функции управления SV
- Поддержка Unicode
- Недокументированные функции
- АВТОРЫ
- СМОТРИТЕ ТАКЖЕ
ИМЯ
perlintern - автоматически сгенерированная документация чисто внутренних функций Perl
ОПИСАНИЕ
Этот файл содержит автоматически сгенерированную документацию функций интерпретатора Perl, которые документированы с использованием внутреннего формата документации Perl, но не помечены как часть API Perl. Другими словами, они не предназначены для использования в расширениях!
Временные метки области видимости во время компиляции
- BhkENTRY
-
ПРИМЕЧАНИЕ: эта функция является экспериментальной и может быть изменена или удалена без предварительного уведомления.
Возвращает запись из структуры BHK.
which— это препроцессорный токен, указывающий, какую запись вернуть. Если соответствующий флаг не установлен, возвращаетсяNULL. Тип возвращаемого значения зависит от того, какую запись вы запрашиваете.void * BhkENTRY(BHK *hk, which) - BhkFLAGS
-
ПРИМЕЧАНИЕ: эта функция является экспериментальной и может быть изменена или удалена без предварительного уведомления.
Возвращает флаги BHK.
U32 BhkFLAGS(BHK *hk) - CALL_BLOCK_HOOKS
-
ПРИМЕЧАНИЕ: эта функция является экспериментальной и может быть изменена или удалена без предварительного уведомления.
Вызывает все зарегистрированные временные метки блока для типа
which.which— это препроцессорный токен; типargзависит отwhich.void CALL_BLOCK_HOOKS(which, arg)
Пользовательские операторы
- core_prototype
-
Эта функция назначает прототип указанной внутренней функции
sv, или новому временному SV, еслиsvравноNULL. Она возвращает измененныйsv, илиNULLесли у внутренней функции нет прототипа.code— это код, возвращённыйkeyword(). Он не должен быть равен 0.SV * core_prototype(SV *sv, const char *name, const int code, int * const opnum)
Функции управления CV
- docatch
-
Проверяет значения 0 или 3 в cur_env.je_ret, используется только внутри контекста eval.
0 используется для продолжения внутри eval,
3 используется для исключения, перехваченного внутренним eval - продолжение внутреннего цикла
См. cop.h: je_mustcatch, когда установлено в TRUE на любом уровне, означает, что операторы eval должны создать локальный jmpenv для обработки ловушек исключений.
OP* docatch(Perl_ppaddr_t firstpp)
Счетчики ссылок CV и CvOUTSIDE
- CvWEAKOUTSIDE
-
Каждый CV имеет указатель
CvOUTSIDE(), на его лексически окружающий CV (если есть). Так как указатели на прототипы анонимных подпрограмм хранятся в&слотах, возможно получить циклическую ссылку, где родитель указывает на ребенка, а ребенок - на родителя. Чтобы избежать утечки памяти, мы не увеличиваем счетчик ссылок CV на который указываетCvOUTSIDEв конкретном случае, когда родитель имеет&слот, указывающий на нас. В этом случае мы устанавливаем флагCvWEAKOUTSIDEв ребенке. Это позволяет нам определить, в каких обстоятельствах нам следует уменьшить счетчик ссылок родителя при освобождении ребенка.Есть ещё осложнение с анонимными подпрограммами, которые не являются замыканиями (т.е. которые не ссылаются на какие-либо лексические переменные за пределами этой подпрограммы). В этом случае, прототип анонимной подпрограммы используется совместно, а не клонируется. Это имеет следствие, что родитель может быть освобождён, в то время как есть активные дети, например:
BEGIN { $a = sub { eval '$x' } }В этом случае BEGIN освобождается сразу после выполнения, поскольку нет активных ссылок на него: прототип анонимной подпрограммы имеет
CvWEAKOUTSIDEустановленным, поскольку он не является замыканием, и $a указывает на тот же CV, поэтому он тоже не влияет на счетчик ссылок BEGIN. Когда выполняется $a,eval '$x'вызывает следование цепочкеCvOUTSIDE, и освобожденный BEGIN обращается к нему.Чтобы избежать этого, каждый раз, когда CV и связанный с ним блок освобождаются, любые записи
&в блоке явно удаляются из блока, и если счетчик ссылок на указанную анонимную подпрограмму всё ещё положителен, тоCvOUTSIDEребёнка устанавливается в указание на его прародителя. Это произойдёт только в единственном случае анонимного прототипа, не являющегося замыканием, имеющего одну или более активных ссылок (например,$aвыше).Ещё один момент, который следует учитывать, это то, что CV может быть просто не определен, а не освобожден, например
undef &foo. В этом случае его счетчик ссылок может не достигнуть нуля, но мы всё равно удаляем его блок иCvROOTи т.д. Поскольку различные дети могут иметь своиCvOUTSIDE, указывающие на этот неопределённый CV, мы сохраняем свойCvOUTSIDEна время, чтобы цепочка лексических областей видимости оставалась неразрывной. Например, следующее должно вывести 123:my $x = 123; sub tmp { sub { eval '$x' } } my $a = tmp(); undef &tmp; print $a->(); bool CvWEAKOUTSIDE(CV *cv)
Функции встраивания
- cv_dump
-
вывод содержимого CV
void cv_dump(CV *cv, const char *title) - cv_forget_slab
-
Когда CV имеет счетчик ссылок на своем блоке (
CvSLABBED), он отвечает за его освобождение. (Следовательно, два CV не должны иметь счетчик ссылок на одном и том же блоке.) CV должен ссылаться на блок только во время компиляции. После компиляции иCvROOTподключения он завершает свою работу, поэтому может забыть блок.void cv_forget_slab(CV *cv) - do_dump_pad
-
Вывести содержимое списка блоков
void do_dump_pad(I32 level, PerlIO *file, PADLIST *padlist, int full) - pad_alloc_name
-
Выделяет место в текущем компилируемом блоке (через "pad_alloc" в perlapi) и затем сохраняет имя для этой записи.
nameпринимается и становится именем записи; она должна уже содержать строку с именем.typestashиourstashиpadadd_STATEфлаг добавляются кname. Никакая другая обработка "pad_add_name_pvn" в perlapi не выполняется. Возвращает смещение выделенного слота блока.PADOFFSET pad_alloc_name(PADNAME *name, U32 flags, HV *typestash, HV *ourstash) - pad_block_start
-
Обновить переменные состояния компиляции блока при входе в новый блок.
void pad_block_start(int full) - pad_check_dup
-
Проверка на дублирующие объявления: сообщается об одном из следующих:
* a 'my' in the current scope with the same name; * an 'our' (anywhere in the pad) with the same name and the same stash as 'ourstash'is_ourуказывает, что проверяемое имя является объявлением"our".void pad_check_dup(PADNAME *name, U32 flags, const HV *ourstash) - pad_findlex
-
Поиск именованного лексического блока в цепочке вложенных блоков. Добавить фиктивные записи во внутренние блоки, если он найден во внешнем.
Возвращает смещение в нижнем блоке лексического блока или фиктивного лексического блока.
cv- CV, в котором следует начать поиск, а seq - текущийcop_seqдля сопоставления. Еслиwarnимеет значение true, выводятся соответствующие предупреждения. Переменныеout_* возвращают значения и поэтому являются указателями на место, где должны храниться возвращаемые значения.out_capture, если не равно null, запрашивает захват внутреннего экземпляра лексического блока;out_nameустанавливается на имя вложенного совпадающего блока или имя фиктивного блока;out_flagsвозвращает флаги, обычно связанные сPARENT_FAKELEX_FLAGSполем имени фиктивного блока.Обратите внимание, что
pad_findlex()рекурсивный; он рекурсивно поднимается по цепочке CV, затем возвращается вниз, добавляя фиктивные записи по мере продвижения. Это необходимо, потому что фиктивные имена в анонимных прототипах должны хранить вxpadn_lowиндекс в родительском блоке.PADOFFSET pad_findlex(const char *namepv, STRLEN namelen, U32 flags, const CV* cv, U32 seq, int warn, SV** out_capture, PADNAME** out_name, int *out_flags) - pad_fixup_inner_anons
-
Для всех анонимных CV в блоке измените
CvOUTSIDEэтого CV сold_cvнаnew_cv, если это необходимо. Необходимо, когда недавно скомпилированный CV необходимо переместить в существующую структуру CV.void pad_fixup_inner_anons(PADLIST *padlist, CV *old_cv, CV *new_cv) - pad_free
-
Освободить SV по смещению po в текущем блоке.
void pad_free(PADOFFSET po) - pad_leavemy
-
Очистка в конце области видимости во время компиляции: установить максимальное значение seq для лексических блоков в этой области видимости и предупредить о любых лексических блоках, которые никогда не были введены.
void pad_leavemy() - padlist_dup
-
Создает копию блока.
PADLIST * padlist_dup(PADLIST *srcpad, CLONE_PARAMS *param) - padname_dup
-
Создает копию имени блока.
PADNAME * padname_dup(PADNAME *src, CLONE_PARAMS *param) - padnamelist_dup
-
Создает копию списка имён блоков.
PADNAMELIST * padnamelist_dup(PADNAMELIST *srcpad, CLONE_PARAMS *param) - pad_push
-
Поместить новый кадр блока в список блоков, если в этом уровне уже есть блок, то не создавайте новый. Затем присвойте новому блоку
@_в нулевом слоте.void pad_push(PADLIST *padlist, int depth) - pad_reset
-
Отметить все текущие временные переменные для повторного использования
void pad_reset() - pad_swipe
-
Отказаться от tmp в текущем блоке по смещению
poи заменить его новым.void pad_swipe(PADOFFSET po, bool refadjust)
GV Functions
- gv_try_downgrade
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Если типглоб
gvможно выразить более кратко, поместив вместо него что-то другое, кроме реального GV, в стэш, замените его оптимизированной формой. Основные требования заключаются в том, чтоgvявляется реальным типглобом, достаточно обычным и ссылается только из своего пакета. Эта функция предназначена для использования, когда GV был частично просмотрен для определения содержимого, что привело к обновлению, но на основе того, что найдено, оказалось, что реальный GV не нужен.Если
gv- полностью пустой типглоб, он удаляется из стэша.Если
gv- типглоб, содержащий только достаточно обычную константную подпрограмму, типглоб заменяется заменой скалярной ссылки, которая более компактно представляет то же самое.void gv_try_downgrade(GV* gv)
Hash Manipulation Functions
- hv_ename_add
-
Добавляет имя в внутренний список эффективных имён стэша. См.
"hv_ename_delete".Вызывается при назначении стэша новому расположению в таблице символов.
void hv_ename_add(HV *hv, const char *name, U32 len, U32 flags) - hv_ename_delete
-
Удаляет имя из внутреннего списка эффективных имён стэша. Если это имя, возвращаемое
HvENAME, то другое имя в списке займёт его место (HvENAMEего использует).Вызывается при удалении стэша из таблицы символов.
void hv_ename_delete(HV *hv, const char *name, U32 len, U32 flags) - refcounted_he_chain_2hv
-
Генерирует и возвращает
HV *, представляющий содержимое цепочкиrefcounted_he.flagsв настоящее время не используется и должно быть равно нулю.HV * refcounted_he_chain_2hv( const struct refcounted_he *c, U32 flags ) - refcounted_he_fetch_pv
-
Как "refcounted_he_fetch_pvn", но принимает строку с нулевым завершением вместо пары "строка/длина".
SV * refcounted_he_fetch_pv( const struct refcounted_he *chain, const char *key, U32 hash, U32 flags ) - refcounted_he_fetch_pvn
-
Поиск по цепочке
refcounted_heдля записи с ключом, заданнымkeypvиkeylen. Если уflagsустановлен битREFCOUNTED_HE_KEY_UTF8, октеты ключа интерпретируются как UTF-8, в противном случае как Latin-1.hash- предварительно вычисленный хэш строки ключа или ноль, если он не был предварительно вычислен. Возвращает смертельный скаляр, представляющий значение, связанное с ключом, или&PL_sv_placeholder, если нет значения, связанного с ключом.SV * refcounted_he_fetch_pvn( const struct refcounted_he *chain, const char *keypv, STRLEN keylen, U32 hash, U32 flags ) - refcounted_he_fetch_pvs
-
Как "refcounted_he_fetch_pvn", но принимает строку без нулевого завершения вместо пары "строка/длина", и нет предварительно вычисленного хэша.
SV * refcounted_he_fetch_pvs( const struct refcounted_he *chain, "literal string" key, U32 flags ) - refcounted_he_fetch_sv
-
Как "refcounted_he_fetch_pvn", но принимает перловский скаляр вместо пары "строка/длина".
SV * refcounted_he_fetch_sv( const struct refcounted_he *chain, SV *key, U32 hash, U32 flags ) - refcounted_he_free
-
Уменьшает счетчик ссылок на
refcounted_heна единицу. Если счетчик ссылок достигает нуля, память структуры освобождается, что (рекурсивно) приводит к уменьшению счетчика ссылок родительской структурыrefcounted_he. В этом случае безопасно передавать указатель null в эту функцию: никаких действий не выполняется.void refcounted_he_free(struct refcounted_he *he) - refcounted_he_inc
-
Увеличивает счетчик ссылок на
refcounted_he. Указатель наrefcounted_heтакже возвращается. В этом случае безопасно передавать указатель null в эту функцию: никаких действий не выполняется и возвращается указатель null.struct refcounted_he * refcounted_he_inc( struct refcounted_he *he ) - refcounted_he_new_pv
-
Как "refcounted_he_new_pvn", но принимает строку с нулевым завершением вместо пары "строка/длина".
struct refcounted_he * refcounted_he_new_pv( struct refcounted_he *parent, const char *key, U32 hash, SV *value, U32 flags ) - refcounted_he_new_pvn
-
Создаёт новую
refcounted_he. Она состоит из единственной пары ключ/значение и ссылки на существующую цепочкуrefcounted_he(которая может быть пустой), и таким образом образует более длинную цепочку. При использовании более длинной цепочки новая пара ключ/значение имеет приоритет над любой записью для того же ключа далее в цепочке.Новый ключ задаётся
keypvиkeylen. Если уflagsустановлен битREFCOUNTED_HE_KEY_UTF8, октеты ключа интерпретируются как UTF-8, в противном случае как Latin-1.hash- предварительно вычисленный хэш строки ключа, или ноль, если он не был предварительно вычислен.value- скалярное значение для хранения по этому ключу.valueкопируется этой функцией, которая, таким образом, не берёт на себя ответственность за любую ссылку на неё, и последующие изменения скаляра не будут отражены в значении, видимом вrefcounted_he. Сложные типы скаляров не будут храниться с целостностью ссылок, а будут преобразованы в строки.valueможет быть либо null, либо&PL_sv_placeholderдля обозначения того, что значение не должно быть связано с ключом; это, как и любое ненулевое значение, имеет приоритет над существованием значения для ключа далее в цепочке.parentуказывает на остальную часть цепочкиrefcounted_heдля присоединения к новомуrefcounted_he. Эта функция берёт на себя ответственность за одну ссылку наparent, и возвращает одну ссылку на новыйrefcounted_he.struct refcounted_he * refcounted_he_new_pvn( struct refcounted_he *parent, const char *keypv, STRLEN keylen, U32 hash, SV *value, U32 flags ) - refcounted_he_new_pvs
-
Как "refcounted_he_new_pvn", но принимает строку без нулевого завершения вместо пары "строка/длина", и нет предварительно вычисленного хэша.
struct refcounted_he * refcounted_he_new_pvs( struct refcounted_he *parent, "literal string" key, SV *value, U32 flags ) - refcounted_he_new_sv
-
Как "refcounted_he_new_pvn", но принимает перловский скаляр вместо пары "строка/длина".
struct refcounted_he * refcounted_he_new_sv( struct refcounted_he *parent, SV *key, U32 hash, SV *value, U32 flags )
IO Functions
- start_glob
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Функция, вызываемая
do_readlineдля запуска глобуса (или выполнения глобуса внутри perl на VMS). Этот код раньше был встроенным, но теперь perl используетFile::Glob. Этот стартер глобуса используется только miniperl во время процесса сборки или при определении PERL_EXTERNAL_GLOB. Перемещение его сокращает pp_hot.c; сокращение pp_hot.c помогает ускорить perl.PerlIO* start_glob(SV *tmpglob, IO *io)
Lexer interface
- validate_proto
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Эта функция выполняет синтаксическую проверку прототипа,
proto. Еслиwarnимеет значение true, любые неправомерные символы или несовпадающие скобки будут вызывать предупреждения illegalproto, заявляя, что они были обнаружены в прототипе дляname.Значение возврата —
true, если это допустимый прототип, иfalse, если нет, независимо от того, было лиwarntrueилиfalse.Обратите внимание, что
NULLявляется допустимымprotoи всегда возвращаетtrue.ПРИМЕЧАНИЕ: perl_ форма этой функции устарела.
bool validate_proto(SV *name, SV *proto, bool warn, bool curstash)
Магические функции
- magic_clearhint
-
Вызывается при удалении из
%^H, записывает ключ вPL_compiling.cop_hints_hash.int magic_clearhint(SV* sv, MAGIC* mg) - magic_clearhints
-
Вызывается при очистке
%^H, сбрасываетPL_compiling.cop_hints_hash.int magic_clearhints(SV* sv, MAGIC* mg) - magic_methcall
-
Вызов магического метода (например, FETCH).
svиmg— это привязанный объект и магическая привязка.meth— имя метода для вызова.argc— количество аргументов (кроме $self), которые нужно передать методу.flagsможет быть:G_DISCARD invoke method with G_DISCARD flag and don't return a value G_UNDEF_FILL fill the stack with argc pointers to PL_sv_undefСами аргументы — любые значения, следующие за аргументом
flags.Возвращает SV (если есть) возвращённый методом или
NULLв случае ошибки.SV* magic_methcall(SV *sv, const MAGIC *mg, SV *meth, U32 flags, U32 argc, ...) - magic_sethint
-
Вызывается при записи в
%^H, записывает пару ключ/значение вPL_compiling.cop_hints_hash. Предполагается, что подсказки не хранят ничего, что потребовало бы глубокой копии. Возможно, стоило бы выводить предупреждение, если мы найдём ссылку.int magic_sethint(SV* sv, MAGIC* mg) - mg_localize
-
Копирует часть магии из существующего SV в новую локальную версию этого SV. Магия контейнера (например,
%ENV,$1,tie) копируется, а магия значения — нет (например,taint,pos).Если
setmagicимеет значение false, то никакие магические установки не будут вызваны на новом (пустом) SV. Это обычно означает, что вскоре последует присваивание (например,'local $x = $y'), и оно обработает магию.void mg_localize(SV* sv, SV* nsv, bool setmagic)
Вспомогательные функции
- free_c_backtrace
-
Освобождает стек вызовов, полученный из get_c_bracktrace.
void free_c_backtrace(Perl_c_backtrace* bt) - get_c_backtrace
-
Собирает стек вызовов (также известный как «стек трейса») в один линейный буфер, выделенный с помощью malloc, который вызывающая сторона обязана
Perl_free_c_backtrace().Сканирует кадры назад на
depth + skip, затем опускаетskipсамый внутренний, возвращая не болееdepthкадров.Perl_c_backtrace* get_c_backtrace(int max_depth, int skip)
Функции MRO
- mro_get_linear_isa_dfs
-
Возвращает линейную последовательность поиска в глубину (Depth-First Search) для
@ISAданного хранилища. Возвращаемое значение — только для чтения AV*.levelдолжно быть 0 (используется внутри рекурсии этой функции).Вы несёте ответственность за
SvREFCNT_inc()возвращаемого значения, если планируете его хранить где-либо на полупостоянной основе (в противном случае оно может быть удалено из-под вас при следующем обновлении кеша).AV* mro_get_linear_isa_dfs(HV* stash, U32 level) - mro_isa_changed_in
-
Выполняет необходимые шаги (в основном очистка кеша), когда
@ISAзаданного пакета изменилось. Вызывается магиейsetisa, не должно вызываться напрямую.void mro_isa_changed_in(HV* stash) - mro_package_moved
-
Вызовите эту функцию, чтобы сообщить хранилищу, что оно было назначено в другое место иерархии хранилищ.
stash— хранилище, которому было назначено место.oldstash— хранилище, которое оно заменяет (если есть).gv— глобус, которому фактически присвоено место.Также можно вызвать с нулевым первым аргументом, чтобы указать, что
oldstashбыло удалено.Эта функция очищает кеши isa для старого хранилища, всех вложенных подпакетов и подклассов всех, включая несуществующие пакеты, имеющие соответствующие записи в
stash.Она также устанавливает эффективные имена (
HvENAME) для всех хранилищ, как требуется.Если
gvприсутствует и отсутствует в таблице символов, эта функция просто возвращает. Эта проверка будет пропущена, еслиflags & 1.void mro_package_moved(HV * const stash, HV * const oldstash, const GV * const gv, U32 flags)
Числовые функции
- grok_atoUV
-
Разбирает строку, ища целое десятичное число без знака.
При входе
pvуказывает на начало строки;valptrуказывает на UV, который получит преобразованное значение, если найдено;endptrлибо равно NULL, либо указывает на переменную, которая указывает на байт после позиции вpv, которую должна проверить эта функция. Еслиendptrравно NULL, тоpvпредполагается завершающимся нулём.Возвращает FALSE, если
pvне представляет собой допустимое значение целого числа без знака (без ведущих нулей). В противном случае возвращает TRUE и устанавливает*valptrна это значение.Если вы ограничиваете часть
pv, на которую смотрит эта функция (передав ненулевойendptr), и если начальные байты этой части образуют допустимое значение, она вернёт TRUE, установив*endptrна байт, следующий за последней цифрой значения. Но если нет ограничений на просматриваемую область, всяpvдолжна быть допустимой, чтобы вернуть TRUE.Единственные допустимые символы — десятичные цифры от '0' до '9'.
В отличие от atoi(3) или strtol(3),
grok_atoUVНЕ допускает необязательных ведущих пробелов, а также отрицательных входных данных. Если такие функции необходимы, вызывающий код должен явно их реализовать.Обратите внимание, что эта функция возвращает FALSE для входных данных, которые могут привести к переполнению UV или содержат ведущие нули. Так, одиночный
0допустим, но не00ни01,002, и так далее.Предыстория:
atoiимеет серьёзные проблемы с неверными входными данными, не может использоваться для инкрементального разбора и поэтому должна избегатьсяatoiиstrtolтакже зависят от настроек локали, что можно рассматривать как ошибку (управляемая пользователем глобальная переменная состояния).bool grok_atoUV(const char* pv, UV* valptr, const char** endptr)
Функции управления Optree
- finalize_optree
-
Эта функция завершает обработку дерева optree. Следует вызывать сразу после построения полного дерева optree. Она выполняет дополнительную проверку, которую нельзя выполнить в обычных
ck_xxx функциях, и делает дерево потокобезопасным.void finalize_optree(OP* o) - newATTRSUB_x
-
Создаёт подпрограмму Perl, выполняя также некоторые связанные задачи.
Ожидается, что эта функция будет вызвана в контексте компиляции Perl, и некоторые аспекты подпрограммы берутся из глобальных переменных, связанных с компиляцией. В частности,
PL_compcvпредставляет подпрограмму, которая в данный момент компилируется. Она должна быть не равной null при вызове этой функции, и некоторые аспекты конструируемой подпрограммы берутся из неё. Созданная подпрограмма может фактически быть повторным использованием объектаPL_compcv, но это не обязательно.Если
blockравно null, то у подпрограммы не будет тела, и в настоящее время будет ошибкой её вызов. Это представляет собой объявление подпрограммы вперёд, например,sub foo ($$);. Еслиblockне равно null, то оно предоставляет код Perl тела подпрограммы, который будет выполнен при вызове подпрограммы. Это тело включает в себя код разворачивания аргументов, полученный из сигнатуры подпрограммы или подобных элементов. Использование стека в коде должно соответствовать стеку, прикреплённому кPL_compcv. Не ожидается, что код будет содержать операторыleavesubилиleavesublv; эта функция добавит такой оператор.blockиспользуется этой функцией и станет частью созданной подпрограммы.protoуказывает прототип подпрограммы, если он не задан в качестве атрибута (см. ниже). Еслиprotoравно null, то подпрограмма не будет иметь прототип. Еслиprotoне равно null, то оно должно указывать на операторconst, значение которого является строкой, и подпрограмма будет иметь эту строку в качестве своего прототипа. Если прототип задан как атрибут, атрибут имеет приоритет надproto, но в этом случаеprotoпредпочтительно должно быть null. В любом случаеprotoпотребляется этой функцией.attrsпредоставляет атрибуты, которые должны быть применены к подпрограмме. Несколько атрибутов вступают в силу встроенными средствами, применяясь кPL_compcvсразу же при появлении. Другие атрибуты собираются и прикрепляются к подпрограмме этим способом.attrsможет быть равно null, чтобы не задавать атрибутов, или указывать на операторconstдля одного атрибута, или указывать на операторlist, чьи дочерние элементы, кромеpushmark, являются операторамиconstдля одного или нескольких атрибутов. Каждый операторconstдолжен быть строкой, содержащей имя атрибута, необязательно с последующими скобками с аргументами, так же, как атрибуты отображаются в исходном коде Perl. Атрибуты будут применены к подпрограмме этой функцией.attrsпотребляется этой функцией.Если
o_is_gvложно иoравно null, то подпрограмма будет анонимной. Еслиo_is_gvложно иoне равно null, тоoдолжен указывать на операторconst, который будет потреблён этой функцией, и его строковое значение указывает имя подпрограммы. Имя может быть квалифицированным или неквалифицированным, и если оно неквалифицировано, то будет выбран стандартный хранилище (stash) каким-то способом. Еслиo_is_gvистинно, тоoвообще не указывает наOP, а вместо этого является указателем наGV, по которому будет именоваться подпрограмма.Если уже существует подпрограмма с указанным именем, то новая подпрограмма либо заменит существующую в глобе, либо будет объединена с существующей. Может быть сгенерировано предупреждение о переопределении.
Если подпрограмма имеет одно из нескольких специальных имён, таких как
BEGINилиEND, то она будет взята соответствующим очереди для автоматического выполнения подпрограмм, связанных с фазами. В этом случае соответствующий глоб останется пустым, даже если он содержал подпрограмму ранее. В случаеBEGIN, подпрограмма будет выполнена, а ссылка на неё будет удалена до возврата этой функции.Функция возвращает указатель на созданную подпрограмму. Если подпрограмма анонимная, то владение одной ссылкой со счётом на подпрограмму передаётся вызывающей стороне. Если подпрограмма имеет имя, то вызывающая сторона не получает владения ссылкой. В большинстве таких случаев, когда подпрограмма имеет имя, отличное от имени фазы, подпрограмма будет существовать в момент возврата благодаря тому, что она содержится в глобе, который её называет. Подпрограмма с именем фазы обычно существует благодаря ссылке, принадлежащей очереди автоматического выполнения фазы. Но подпрограмма
BEGIN, уже выполненная, с большой вероятностью будет уничтожена к моменту возврата этой функции, что сделает ошибочным использование вызывающей стороной возвращённого указателя. Вызывающая сторона несет ответственность за то, чтобы знать, какой из этих случаев имеет место.CV * newATTRSUB_x(I32 floor, OP *o, OP *proto, OP *attrs, OP *block, bool o_is_gv) - newXS_len_flags
-
Создаёт подпрограмму XS, выполняя также некоторые связанные задачи.
Подпрограмма будет иметь точку входа
subaddr. Она будет иметь прототип, заданный нуль-завершённой строкойproto, или без прототипа, еслиprotoравно null. Строка прототипа копируется; вызывающая сторона может модифицировать предоставленную строку после этого. Еслиfilenameне равно null, оно должно быть нуль-завершённым именем файла, и подпрограмма будет иметь свойCvFILEсоответствующим образом. По умолчаниюCvFILEустанавливается в непосредственное указание на предоставленную строку, которая должна быть статической. Еслиflagsимеет установленный битXS_DYNAMIC_FILENAME, то вместо этого будет взята копия строки.Другие аспекты подпрограммы будут оставлены в их состоянии по умолчанию. Если для корректной работы подпрограммы требуется что-либо ещё, вызывающая сторона несет ответственность за это после того, как функция её создаст. Однако будьте осторожны, так как подпрограмма потенциально может быть уничтожена до возврата этой функции, как описано ниже.
Если
nameравно null, то подпрограмма будет анонимной, и еёCvGVбудет ссылаться на__ANON__глоб. Еслиnameне равно null, то подпрограмма будет названа соответствующим образом, ссылаться на соответствующий глоб.name— это строка длинойlenбайт, задающая имя символа без сигнатуры, в UTF-8, еслиflagsимеет установленный битSVf_UTF8, и в Latin-1 в противном случае. Имя может быть квалифицированным или неквалифицированным, со стандартным хранилищем (stash), выбранным так же, как дляgv_fetchpvn_flags.flagsможет содержать флаги, понимаемыеgv_fetchpvn_flags, со значением, аналогичным тому, которое у них есть там, напримерGV_ADDWARN. Символ всегда добавляется в хранилище (stash), если необходимо, с семантикойGV_ADDMULTI.Если уже существует подпрограмма с указанным именем, то новая подпрограмма заменит существующую в глобе. Может быть сгенерировано предупреждение о переопределении. Если старая подпрограмма была
CvCONST, то решение о том, предупреждать или нет, зависит от ожиданий того, станет ли новая подпрограмма константой с подобным значением. Это ожидание определяетсяconst_svp. (Обратите внимание, что вызов этой функции не делает новую подпрограммуCvCONSTв любом случае; это оставлено вызывающей стороне.) Еслиconst_svpравно null, это означает, что новая подпрограмма не станет константой. Еслиconst_svpне равно null, это означает, что новая подпрограмма станет константой, и она указывает наSV*, который предоставляет константное значение, которым будет обладать подпрограмма.Если подпрограмма имеет одно из нескольких специальных имён, таких как
BEGINилиEND, то она будет взята соответствующим очереди для автоматического выполнения подпрограмм, связанных с фазами. В этом случае соответствующий глоб останется пустым, даже если он содержал подпрограмму ранее. В случаеBEGIN, подпрограмма будет выполнена, и ссылка на неё будет удалена до возврата этой функции, а также до установки её прототипа. Если подпрограммаBEGINне будет достаточно сконструирована этой функцией для готовности к выполнению, то вызывающая сторона должна предотвратить это, дав подпрограмме другое имя.Функция возвращает указатель на созданную подпрограмму. Если подпрограмма анонимная, то владение одной ссылкой со счётом на подпрограмму передаётся вызывающей стороне. Если подпрограмма имеет имя, то вызывающая сторона не получает владения ссылкой. В большинстве таких случаев, когда подпрограмма имеет имя, отличное от имени фазы, подпрограмма будет существовать в момент возврата благодаря тому, что она содержится в глобе, который её называет. Подпрограмма с именем фазы обычно существует благодаря ссылке, принадлежащей очереди автоматического выполнения фазы. Но подпрограмма
BEGIN, уже выполненная, с большой вероятностью будет уничтожена к моменту возврата этой функции, что сделает ошибочным использование вызывающей стороной возвращённого указателя. Вызывающая сторона несёт ответственность за то, чтобы знать, какой из этих случаев имеет место.CV * newXS_len_flags(const char *name, STRLEN len, XSUBADDR_t subaddr, const char *const filename, const char *const proto, SV **const_svp, U32 flags) - optimize_optree
-
Эта функция применяет некоторые оптимизации к дереву optree в порядке сверху вниз. Она вызывается перед оптимизатором peephole, который обрабатывает операторы в порядке выполнения. Обратите внимание, что finalize_optree() также выполняет поиск сверху вниз, но вызывается *после* оптимизатора peephole.
void optimize_optree(OP* o) - traverse_op_tree
-
Возвращает следующий оператор в обходе дерева операторов в глубину, возвращая NULL, когда обход завершён.
Первый вызов должен передать корень дерева как top, так и o.
Пока что это статическая функция, но в будущем она может быть доступна в API.
traverse_op_tree;
Структуры данных падов
- CX_CURPAD_SAVE
-
Сохранить текущий блок в заданной структуре контекста.
void CX_CURPAD_SAVE(struct context) - CX_CURPAD_SV
-
Доступ к SV по смещению
poв сохранённом текущем блоке в заданной структуре контекста (может использоваться как lvalue).SV * CX_CURPAD_SV(struct context, PADOFFSET po) - PAD_BASE_SV
-
Получить значение из слота
poв базовом (DEPTH=1) блоке списка блоков.SV * PAD_BASE_SV(PADLIST padlist, PADOFFSET po) - PAD_CLONE_VARS
-
Клонировать переменные состояния, связанные с выполняемыми и компилируемыми блоками.
void PAD_CLONE_VARS(PerlInterpreter *proto_perl, CLONE_PARAMS* param) - PAD_COMPNAME_FLAGS
-
Возвращает флаги для текущего имени компилируемого блока по смещению
po. Предполагается наличие действительной записи слота.U32 PAD_COMPNAME_FLAGS(PADOFFSET po) - PAD_COMPNAME_GEN
-
Номер поколения имени по смещению
poв текущем компилируемом блоке (lvalue).STRLEN PAD_COMPNAME_GEN(PADOFFSET po) - PAD_COMPNAME_GEN_set
-
Устанавливает номер поколения имени по смещению
poв текущем блоке (lvalue) на значениеgen. STRLEN PAD_COMPNAME_GEN_set(PADOFFSET po, int gen) - PAD_COMPNAME_OURSTASH
-
Возвращает стежок, связанный с переменной
our. Предполагается, что запись слота является корректным лексическим элементомour.HV * PAD_COMPNAME_OURSTASH(PADOFFSET po) - PAD_COMPNAME_PV
-
Возвращает имя текущего компилируемого блока по смещению
po. Предполагается наличие действительной записи слота.char * PAD_COMPNAME_PV(PADOFFSET po) - PAD_COMPNAME_TYPE
-
Возвращает тип (стежок) текущего имени компилируемого блока по смещению
po. Должно быть действительное имя. Возвращает null, если тип не задан.HV * PAD_COMPNAME_TYPE(PADOFFSET po) - PadnameIsOUR
-
Является ли эта переменная "our"?
bool PadnameIsOUR(PADNAME pn) - PadnameIsSTATE
-
Является ли эта переменная "state"?
bool PadnameIsSTATE(PADNAME pn) - PadnameOURSTASH
-
Стежок, в котором была объявлена эта переменная "our".
HV * PadnameOURSTASH() - PadnameOUTER
-
Принадлежит ли эта запись внешнему блоку. Записи, для которых это true, часто называются "поддельными".
bool PadnameOUTER(PADNAME pn) - PadnameTYPE
-
Стежок, связанный с типизированным лексическим элементом. Возвращает хэш
%Foo::дляmy Foo $bar.HV * PadnameTYPE(PADNAME pn) - PAD_RESTORE_LOCAL
-
Восстановить старый блок, сохранённый в локальной переменной
opadс помощьюPAD_SAVE_LOCAL()void PAD_RESTORE_LOCAL(PAD *opad) - PAD_SAVE_LOCAL
-
Сохранить текущий блок в локальную переменную
opad, затем установить текущий блок равнымnpadvoid PAD_SAVE_LOCAL(PAD *opad, PAD *npad) - PAD_SAVE_SETNULLPAD
-
Сохранить текущий блок, затем установить его в null.
void PAD_SAVE_SETNULLPAD() - PAD_SETSV
-
Установить значение в слоте по смещению
poв текущем блоке наsvSV * PAD_SETSV(PADOFFSET po, SV* sv) - PAD_SET_CUR
-
Установить текущий блок на блок
nв списке блоков, сохраняя предыдущий текущий блок. Примечание: в настоящее время этот макрос расширяется до слишком длинной строки для некоторых компиляторов, поэтому лучше заменить его наSAVECOMPPAD(); PAD_SET_CUR_NOSAVE(padlist,n); void PAD_SET_CUR(PADLIST padlist, I32 n) - PAD_SET_CUR_NOSAVE
-
как PAD_SET_CUR, но без сохранения
void PAD_SET_CUR_NOSAVE(PADLIST padlist, I32 n) - PAD_SV
-
Получить значение по смещению
poв текущем блокеSV * PAD_SV(PADOFFSET po) - PAD_SVl
-
Легковесная и lvalue версия
PAD_SV. Получить или установить значение по смещениюpoв текущем блоке. В отличие отPAD_SV, не выводит диагностику с -DX. Только для внутреннего использования.SV * PAD_SVl(PADOFFSET po) - SAVECLEARSV
-
Очистить значение указанного блока при выходе из области видимости. (т.е. действие в ходе выполнения
my)void SAVECLEARSV(SV **svp) - SAVECOMPPAD
-
сохранить
PL_comppadиPL_curpadvoid SAVECOMPPAD() - SAVEPADSV
-
Сохранить слот блока (используется для восстановления после итерации)
XXX DAPM было бы логичнее сделать аргумент PADOFFSET void SAVEPADSV(PADOFFSET po)
Переменные интерпретатора
- PL_DBsingle
-
При запуске Perl в режиме отладки с ключом -d, эта переменная SV является булевой, указывающей, выполняется ли пошаговая отладка подпрограмм. Пошаговая отладка автоматически включается после каждого шага. Это C-переменная, соответствующая Perl-переменной $DB::single. См.
"PL_DBsub".SV * PL_DBsingle - PL_DBsub
-
При запуске Perl в режиме отладки с ключом -d, эта переменная GV содержит SV, хранящий имя отлаживаемой подпрограммы. Это C-переменная, соответствующая Perl-переменной $DB::sub. См.
"PL_DBsingle".GV * PL_DBsub - PL_DBtrace
-
Переменная отслеживания, используемая при запуске Perl в режиме отладки с ключом -d. Это C-переменная, соответствующая Perl-переменной $DB::trace. См.
"PL_DBsingle".SV * PL_DBtrace - PL_dowarn
-
C-переменная, примерно соответствующая Perl-переменной
$^Wwarning. Однако$^Wобрабатывается как булево значение, тогда какPL_dowarnпредставляет собой набор флаговых битов.U8 PL_dowarn - PL_last_in_gv
-
GV, который был последним использован для операции ввода из файла. (
<FH>)GV* PL_last_in_gv - PL_ofsgv
-
Глобальная переменная, содержащая разделитель полей вывода -
*,в пространстве Perl.GV* PL_ofsgv - PL_rs
-
Разделитель записей ввода -
$/в пространстве Perl.SV* PL_rs
Макросы управления стеком
- djSP
-
Объявить только
SP. Это фактически идентичноdSP, и объявляет локальную копию указателя стека Perl, доступную через макросSP. См."SP" in perlapi. (Доступно для обратной совместимости с кодом старой модели потоков (Perl 5.005)).djSP; - LVRET
-
True, если данный оператор будет результатом выполнения lvalue подпрограммы
Функции обработки SV
SV (или AV, HV и т. д.) выделяется из двух частей: заголовок (struct sv, av, hv...) содержит информацию о типе и счетчике ссылок, а для многих типов — указатель на тело (struct xrv, xpv, xpviv...), содержащее поля, специфичные для каждого типа. Некоторые типы хранят всю необходимую информацию в заголовке, поэтому у них нет тела.
Во всех, за исключением наиболее параноидальных с точки зрения памяти конфигураций (например: PURIFY), заголовки и тела выделяется в аренах, которые по умолчанию представляют собой примерно 4К кусков памяти, распределённых на N заголовков или тел. Тела SV выделяются по типу SV, гарантируя необходимую согласованность размера для безопасного выделения из массивов.
Для заголовков SV первый слот в каждой арене зарезервирован и содержит ссылку на следующую арену, некоторые флаги и примечание о количестве слотов. По цепочке каждой арены проходит связанный список свободных элементов; когда он становится пустым, выделяется дополнительная арена и делится на N элементов, которые вставляются в свободный список.
Тела SV аналогичны, но используют наборы арен по умолчанию, которые отделяют ссылку и информацию от самой арены и освобождают первый слот в арене. Тела SV описываются подробнее позже.
Следующие глобальные переменные связаны с аренами:
PL_sv_arenaroot pointer to list of SV arenas
PL_sv_root pointer to list of free SV structures
PL_body_arenas head of linked-list of body arenas
PL_body_roots[] array of pointers to list of free bodies of svtype
arrays are indexed by the svtype needed Несколько специальных заголовков SV не выделяются из арены, а создаются непосредственно в структуре интерпретатора, например, PL_sv_undef. Размер арен можно изменить от значения по умолчанию, задав PERL_ARENA_SIZE соответствующим образом во время компиляции.
Арена SV служит дополнительной цели, позволяющей найти и уничтожить всё ещё живые SV во время окончательной очистки.
На самом низком уровне макросы new_SV() и del_SV() берут и освобождают заголовок SV. (Если отлаживать с -DD, del_SV() вызывает функцию S_del_sv() для возврата SV в список свободных элементов с проверкой ошибок.) new_SV() вызывает more_sv() / sv_add_arena(), чтобы добавить дополнительную арену, если свободный список пуст. У SV в свободном списке поле SvTYPE установлено во все единицы.
В момент очень поздней очистки функция sv_free_arenas() вызывается из perl_destruct() для физического освобождения всех арен, выделенных с момента запуска интерпретатора.
Функция visit() сканирует список арен SV и вызывает указанную функцию для каждого SV, который всё ещё жив — т. е. у которого поле SvTYPE отличное от всех единиц и поле SvREFCNT отлично от нуля. visit() используется следующими функциями (указано [функция, вызывающая visit()] / [функция, вызываемая visit() для каждого SV]):
sv_report_used() / do_report_used()
dump all remaining SVs (debugging aid)
sv_clean_objs() / do_clean_objs(),do_clean_named_objs(),
do_clean_named_io_objs(),do_curse()
Attempt to free all objects pointed to by RVs,
try to do the same for all objects indir-
ectly referenced by typeglobs too, and
then do a final sweep, cursing any
objects that remain. Called once from
perl_destruct(), prior to calling sv_clean_all()
below.
sv_clean_all() / do_clean_all()
SvREFCNT_dec(sv) each remaining SV, possibly
triggering an sv_free(). It also sets the
SVf_BREAK flag on the SV to indicate that the
refcnt has been artificially lowered, and thus
stopping sv_free() from giving spurious warnings
about SVs which unexpectedly have a refcnt
of zero. called repeatedly from perl_destruct()
until there are no SVs left. - sv_2num
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Возвращает SV с числовым значением исходного SV, выполняя необходимые преобразования ссылок или перегрузки. Отправитель функции ожидает, что обработка get-magic уже выполнена.
SV* sv_2num(SV *const sv) - sv_add_arena
-
Принимая кусок памяти, связывает его с началом списка аренов и разбивает его на список свободных SV.
void sv_add_arena(char *const ptr, const U32 size, const U32 flags) - sv_clean_all
-
Уменьшает refcnt каждого оставшегося SV, что может привести к очистке. Возможно, потребуется вызвать эту функцию несколько раз, чтобы освободить SV, находящиеся в сложных самоссылочных иерархиях.
I32 sv_clean_all() - sv_clean_objs
-
Попытка уничтожить все объекты, которые ещё не освобождены.
void sv_clean_objs() - sv_free_arenas
-
Освобождает память, используемую всеми аренами. Обратите внимание, что все отдельные заголовки и тела SV внутри аренов должны быть уже освобождены.
void sv_free_arenas() - SvTHINKFIRST
-
Быстрая проверка флага, чтобы увидеть, должен ли
svпередаваться вsv_force_normal, чтобы быть «пониженным», прежде чемSvIVXилиSvPVXможно будет изменить напрямую.Например, если ваш скаляр — ссылка, и вы хотите изменить слот
SvIVX, вы не можете просто сделатьSvROK_off, так как это приведёт к утечке референта.Это используется внутренне различными функциями модификации sv, такими как
sv_setsv,sv_setivиsv_pvn_force.Один случай, который эта функция не обрабатывает, — gv без установленного SvFAKE. После
if (SvTHINKFIRST(gv)) sv_force_normal(gv);он всё ещё будет gv.
SvTHINKFIRSTиногда даёт ложноположительные результаты. В таких случаяхsv_force_normalничего не делает.U32 SvTHINKFIRST(SV *sv)
Поддержка Unicode
- find_uninit_var
-
ПРИМЕЧАНИЕ: эта функция экспериментальная и может быть изменена или удалена без предварительного уведомления.
Находит имя неопределённой переменной (если таковая имеется), которая вызвала предупреждение оператора "Использование неопределённого значения". Если match истинно, возвращает имя только в случае совпадения его значения с
uninit_sv. Грубо говоря, если унарный оператор (например,OP_COS) генерирует предупреждение, то проследив за непосредственным потомком op, можно получитьOP_PADSVилиOP_GV, которые указывают имя неопределённой переменной. С другой стороны, дляOP_ADDесть два пути следования, поэтому мы выводим имя переменной только в случае точного совпадения.desc_pуказывает на указатель строки, содержащий описание оператора. Он может быть обновлён при необходимости.Имя возвращается в виде смертного SV.
Предполагается, что
PL_op— это OP, который изначально вызвал ошибку, аPL_comppad/PL_curpadуказывают на текущий выполняемый блок.SV* find_uninit_var(const OP *const obase, const SV *const uninit_sv, bool match, const char **desc_p) - isSCRIPT_RUN
-
Возвращает булево значение о том, образуют ли последовательность байтов от
sдо, но не включаяsend, "выполнение сценария".utf8_targetИСТИННО тогда и только тогда, когда последовательность, начинающаяся вs, должна обрабатываться как UTF-8. Точнее, за исключением двух вырожденных случаев, данная функция возвращает ИСТИННО тогда и только тогда, когда все кодовые точки в ней происходят от любого сочетания трёх «скриптов», заданных свойством Unicode "Script Extensions": Общие, Наследованные и, возможно, ещё один. Кроме того, все десятичные цифры должны происходить из одной последовательной группы из 10.Например, если все символы в последовательности являются греческими, или общими, или наследованными, эта функция вернёт ИСТИННО, при условии, что все десятичные цифры в ней относятся к одной группе цифр в Общих (это ASCII-цифры "0".."9" и, дополнительно, группа для полных ширины форм этих цифр, а также несколько других, используемых в математической нотации). Для скриптов (в отличие от греческого), имеющих свои собственные наборы цифр, это примет либо цифры из этого набора, либо из одного из наборов общих цифр, но не их комбинацию. Некоторые скрипты, такие как арабский, имеют более одного набора цифр. Все цифры должны принадлежать одному набору, чтобы функция возвращала ИСТИННО.
*ret_script, еслиret_scriptне NULL, то при возвращении ИСТИННО, будет содержать обнаруженный скрипт, используя типSCX_enum. Его значение будетSCX_INVALID, если функция возвращает ЛОЖЬ.Если последовательность пуста, возвращается ИСТИННО, но
*ret_script(если запрошен) будетSCX_INVALID.Если последовательность содержит одну кодовую точку, которая не назначена символу в используемой версии Unicode, функция вернёт ИСТИННО, и скрипт будет
SCX_Unknown. Любая другая комбинация неназначенных кодовых точек в входной последовательности приведет к тому, что функция будет рассматривать входные данные как не являющиеся выполнением сценария.Возвращаемый скрипт будет
SCX_Inheritedтолько если все кодовые точки в нём взяты из наследуемого скрипта.В противном случае, возвращаемый скрипт будет
SCX_Commonесли все кодовые точки в нём взяты из наследуемого или общего скриптов.bool isSCRIPT_RUN(const U8 *s, const U8 *send, const bool utf8_target) - is_utf8_non_invariant_string
-
Возвращает ИСТИННО, если "is_utf8_invariant_string" в perlapi возвращает ЛОЖЬ для первых
lenбайтов строкиs, но они, тем не менее, являются допустимыми Perl-расширенными UTF-8; в противном случае возвращает ЛОЖЬ.Возвращаемое значение ИСТИННО означает, что по крайней мере одна кодовая точка, представленная последовательностью, либо является широким символом, не представимым одним байтом, либо её представление отличается в зависимости от того, закодирована ли последовательность в UTF-8 или нет.
См. также
"is_utf8_invariant_string" in perlapi,"is_utf8_string" in perlapibool is_utf8_non_invariant_string(const U8* const s, STRLEN len) - report_uninit
-
Выводит соответствующее предупреждение "Использование неопределённой переменной".
void report_uninit(const SV *uninit_sv) - variant_under_utf8_count
-
Эта функция анализирует последовательность байтов между
sиe, которые предполагаются закодированными в ASCII/Latin1, и возвращает, сколько из них изменится, если строка будет преобразована в UTF-8. Из-за особенностей UTF-8 каждый из них будет занимать два байта вместо одного в входной строке. Таким образом, эта функция возвращает точное количество байтов, на которое строка увеличится при переводе в UTF-8.В отличие от большинства других функций, содержащих
utf8в своём имени, входной параметр этой функции НЕ является UTF-8-строкой. Имя функции немного *необычно*, чтобы подчеркнуть это.Эта функция является внутренней для Perl, потому что khw считает, что любой XS-код, которому это потребуется, вероятно, работает слишком близко к внутренностям. Представление действительного примера использования может это изменить.
См. также
"is_utf8_invariant_string" in perlapiи"is_utf8_invariant_string_loc" in perlapi,Size_t variant_under_utf8_count(const U8* const s, const U8* const e)
Недокументированные функции
Следующие функции в настоящее время не документированы. Если вы используете одну из них, вы можете рассмотреть возможность создания и отправки документации к ней.
- PerlIO_восстановить_errno
- PerlIO_сохранить_errno
- PerlLIO_dup2_cloexec
- PerlLIO_dup_cloexec
- PerlLIO_open3_cloexec
- PerlLIO_open_cloexec
- PerlProc_pipe_cloexec
- PerlSock_accept_cloexec
- PerlSock_socket_cloexec
- PerlSock_socketpair_cloexec
- Slab_Выделить
- Slab_Освободить
- Slab_в_только_для_чтения
- Slab_в_чтение_запись
- _добавить_диапазон_в_invlist
- _байтовый_вывод_строки
- _получить_данные_класса_регистра_без_битовой_карты
- _обратные_сложения
- _invlistEQ
- _инициализация_массива_invlist
- _invlist_содержит_символ
- _вывод_invlist
- _пересечение_invlist
- _пересечение_invlist_возможно_дополнение_второго
- _инвертирование_invlist
- _длина_invlist
- _поиск_в_invlist
- _вычитание_из_invlist
- _объединение_invlist
- _объединение_invlist_возможно_дополнение_второго
- _является_графическим_символом
- _принадлежит_категории_локалей
- _mem_collxfrm
- _новый_invlist
- _новый_invlist_C_массив
- _настройка_готового_invlist
- _преобразовать_в_сложенные_latin1
- _преобразовать_в_заглавные_с_заглавной_буквы_latin1
- _предупреждение_о_проблемной_локали
- прервать_выполнение
- добавить_символ_в_invlist
- выделить_LOGOP
- выделить_my
- amagic_активирован
- дополнить_utf8_из_нативного_байта
- применить
- av_расширить_внутренности
- av_нет_элемента
- av_реализовать
- привязать_сопоставление
- загрузка_ядра_PerlIO
- загрузка_ядра_UNIVERSAL
- загрузка_ядра_mro
- можно
- проверить_печать_utf8
- ck_анонимный_код
- ck_обратные_кавычки
- ck_битовая_операция
- ck_сравнение
- ck_конкатенация
- ck_определено
- ck_удалить
- ck_каждый
- ck_аргументы_вхождения_в_подпрограмму_ядро
- ck_конец_файла
- ck_вычисление
- ck_выполнение
- ck_существует
- ck_ftst
- ck_функция
- ck_глоб
- ck_grep
- ck_индекс
- ck_соединить
- ck_длина
- ck_lfun
- ck_список_ввода_вывода
- ck_сопоставление
- ck_метод
- ck_нуль
- ck_открыть
- ck_прототип
- ck_строка_из_строки
- ck_присвоение_ссылки
- ck_повторить
- ck_требуется
- ck_возврат
- ck_rfun
- ck_rvconst
- ck_присвоение_скаляру
- ck_выбрать
- ck_сдвинуть
- ck_умное_сопоставление
- ck_сортировать
- ck_пара
- ck_разбить
- ck_преобразовать_в_строку
- ck_подпрограмма
- ck_подстрока
- ck_svconst
- ck_tell
- ck_обрезать
- самый_близкий_cop
- вычислить_приблизительно
- операция_встроенной_подпрограммы
- создать_область_вычислений
- croak_вызывающий
- croak_нет_памяти
- croak_вытащить_из_стека
- текущий_двигатель_регулярных_выражений
- пользовательская_операция_получить_поле
- cv_ckproto_длина_флаги
- cv_клонировать_в
- cv_постоянная_sv_или_av
- cv_флаги_неопределения
- cvgv_из_hek
- cvgv_установить
- cvstash_установить
- deb_стек_все
- defelem_цель
- удалить_область_вычислений
- delimcpy_без_экранирования
- die_разворот
- выполнить_aexec
- выполнить_aexec5
- выполнить_eof
- выполнить_exec
- выполнить_exec3
- выполнить_ipcctl
- выполнить_ipcget
- выполнить_msgrcv
- выполнить_msgsnd
- выполнить_ncmp
- выполнить_open6
- выполнить_open_raw
- выполнить_печать
- выполнить_строку_из_строки
- выполнить_переход
- выполнить_semop
- выполнить_shmio
- выполнить_sysseek
- выполнить_tell
- выполнить_трансформацию
- выполнить_vecget
- выполнить_vecset
- выполнить_vop
- переполнение_utf8
- выполнить_файл
- drand48_инициализировать_r
- drand48_r
- dtrace_отлавливание_вызова
- dtrace_отлавливание_загрузки
- dtrace_отлавливание_операции
- dtrace_отлавливание_фазы
- вывести_все_perl
- вывести_пакетные_подпрограммы_perl
- вывести_подпрограмму_perl
- вывести_потомка_sv
- дублировать_предупреждения
- эмулировать_cop_ввод_вывод
- функция_активирована
- найти_лексическую_cv
- найти_выполняемую_cv_где
- найти_скрипт
- foldEQ_latin1_s2_сложенный
- формат_короткий_восьмеричный_предупреждение
- освободить_связанный_пул_hv
- получить_и_проверить_backslash_N_имя
- получить_db_подпрограмму
- получить_дебажные_опции
- получить_семя_хеша
- получить_адрес_итератора_invlist
- получить_адрес_смещения_invlist
- получить_адрес_предыдущего_индекса_invlist
- получить_не_изменять
- получить_аргументы_оператора
- получить_аргумент_ре
- getenv_длина
- обработать_bslash_c
- обработать_bslash_o
- обработать_bslash_x
- gv_fetchmeth_внутренний
- gv_переопределить
- gv_установить_ссылку
- gv_stashpvn_внутренний
- gv_stashsvpvn_кешированный
- обработать_именованную_обратную_ссылку
- обработать_пользовательское_определяемое_свойство
- hfree_следующая_запись
- hv_обратные_ссылки_p
- hv_убить_обратные_ссылки
- hv_заполнитель_p
- hv_добавить_ключ_значение
- hv_флаги_неопределения
- инициализировать_символы_argv
- инициализировать_константы
- инициализировать_dbargs
- инициализировать_отладчик
- инициализировать_именованную_cv
- инициализировать_uniprops
- инвертировать
- invlist_массив
- invlist_очистить
- invlist_клонировать
- invlist_наибольший
- invlist_итерация
- invlist_завершить_итерацию
- invlist_инициализация_итерации
- invlist_максимум
- invlist_предыдущий_индекс
- invlist_установить_длину
- invlist_установить_предыдущий_индекс
- invlist_укоротить
- io_закрыть
- isFF_OVERLONG
- isFOO_lc
- является_invlist
- is_utf8_обычный
- is_utf8_обычный_с_длиной
- is_utf8_слишком_длинный_для_данного_стартового_байта_в_порядке
- isinfnansv
- jmaybe
- ключевое_слово
- ключевое_слово_стандартный_плагин
- список
- локализовать
- магия_очистить_все_переменные_среды
- магия_очистить_arylen_p
- магия_очистить_среду
- магия_очистить_isa
- магия_очистить_упаковку
- магия_очистить_сигнал
- магия_скопировать_callchecker
- магия_существует_упаковка
- магия_освободить_arylen_p
- магия_освободить_переопределения
- магия_получить
- магия_получить_arylen
- магия_получить_дебажную_переменную
- магия_получить_defelem
- магия_получить_nkeys
- магия_получить_упаковку
- магия_получить_положение
- магия_получить_сигнал
- магия_получить_подстроку
- магия_получить_загрязнение
- магия_получить_uvar
- магия_получить_vec
- магия_убить_обратные_ссылки
- магия_следующая_упаковка
- магия_regdata_счет
- магия_regdatum_получить
- магия_regdatum_установить
- магия_скалярная_упаковка
- магия_установить
- магия_установить_все_переменные_среды
- магия_установить_arylen
- магия_установить_collxfrm
- магия_установить_dbline
- магия_установить_дебажную_переменную
- магия_установить_defelem
- магия_установить_переменную_среды
- магия_установить_isa
- магия_установить_lvref
- магия_установить_mglob
- магия_установить_nkeys
- магия_установить_nonelem
- магия_установить_упаковку
- магия_установить_положение
- magic_setregexp
- magic_setsig
- magic_setsubstr
- magic_settaint
- magic_setutf8
- magic_setuvar
- magic_setvec
- magic_sizepack
- magic_wipepack
- malloc_good_size
- malloced_size
- mem_collxfrm
- mem_log_alloc
- mem_log_free
- mem_log_realloc
- mg_find_mglob
- mode_from_discipline
- more_bodies
- mro_meta_dup
- mro_meta_init
- multiconcat_stringify
- multideref_stringify
- my_attrs
- my_clearenv
- my_lstat_flags
- my_memrchr
- my_mkostemp
- my_mkstemp
- my_mkstemp_cloexec
- my_stat_flags
- my_strerror
- my_unexec
- newGP
- newMETHOP_internal
- newSTUB
- newSVavdefelem
- newXS_deffile
- new_warnings_bitfield
- nextargv
- noperl_die
- notify_parser_that_changed_to_utf8
- oopsAV
- oopsHV
- op_clear
- op_integerize
- op_lvalue_flags
- op_refcnt_dec
- op_refcnt_inc
- op_relocate_sv
- op_std_init
- op_unscope
- opmethod_stash
- opslab_force_free
- opslab_free
- opslab_free_nopad
- package
- package_version
- pad_add_weakref
- padlist_store
- padname_free
- padnamelist_free
- parse_unicode_opts
- parse_uniprop_string
- parser_free
- parser_free_nexttoke_ops
- path_is_searchable
- peep
- pmruntime
- populate_isa
- ptr_hash
- qerror
- re_exec_indentf
- re_indentf
- re_op_compile
- re_printf
- reg_named_buff
- reg_named_buff_iter
- reg_numbered_buff_fetch
- reg_numbered_buff_length
- reg_numbered_buff_store
- reg_qr_package
- reg_skipcomment
- reg_temp_copy
- regcurly
- regprop
- report_evil_fh
- report_redefined_cv
- report_wrongway_fh
- rpeep
- rsignal_restore
- rsignal_save
- rxres_save
- same_dirent
- save_strlen
- save_to_buffer
- sawparens
- scalar
- scalarvoid
- scan_str
- scan_word
- set_caret_X
- set_numeric_standard
- set_numeric_underlying
- set_padlist
- setfd_cloexec
- setfd_cloexec_for_nonsysfd
- setfd_cloexec_or_inhexec_by_sysfdness
- setfd_inhexec
- setfd_inhexec_for_sysfd
- should_warn_nl
- sighandler
- skipspace_flags
- softref2xv
- ssc_add_range
- ssc_clear_locale
- ssc_cp_and
- ssc_intersection
- ssc_union
- sub_crush_depth
- sv_add_backref
- sv_buf_to_ro
- sv_del_backref
- sv_free2
- sv_kill_backrefs
- sv_len_utf8_nomg
- sv_magicext_mglob
- sv_mortalcopy_flags
- sv_only_taint_gmagic
- sv_or_pv_pos_u2b
- sv_resetpvn
- sv_sethek
- sv_setsv_cow
- sv_unglob
- swash_fetch
- swash_init
- tied_method
- tmps_grow_p
- translate_substr_offsets
- try_amagic_bin
- try_amagic_un
- uiv_2buf
- utf16_to_utf8
- utf16_to_utf8_reversed
- utilize
- varname
- vivify_defelem
- vivify_ref
- wait4pid
- was_lvalue_sub
- watch
- win32_croak_not_implemented
- write_to_stderr
- xs_boot_epilog
- xs_handshake
- yyerror
- yyerror_pv
- yyerror_pvn
- yylex
- yyparse
- yyquit
- yyunlex
Авторы
Система автоматической документации была первоначально добавлена в ядро Perl Бенджамином Штулем. Документация написана теми, кто любезно задокументировал свои функции.
См. также
© 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.30.3/perlintern