內容

名稱

perlintern - 純粹 內部 Perl 函式的自動產生文件

描述

本文件是 Perl 解譯器中使用 Perl 內部文件格式記錄的函式的自動產生文件,但並未標記為 Perl API 的一部分。換句話說,它們不適用於擴展

它與 perlapi 具有相同的部分,但有些部分可能是空的。

AV 處理

av_fetch_simple

這是 av_fetch 的簡化版本,假設數組非常簡單 - 沒有魔法,不是唯讀的,並且 AvREAL - 並且 key 不是負數。在任何這些假設可能不成立的情況下,絕對不能使用此函式。

返回數組中指定索引的 SV。 key 是索引。如果 lval 為真,則保證可以得到一個真正的 SV(如果以前不是真實的),然後可以修改它。在將其解引用為 SV* 之前,請檢查返回值是否非空。

粗略的 Perl 等效形式是 $myarray[$key]

    SV **  av_fetch_simple(AV *av, SSize_t key, I32 lval)
AvFILLp

如果數組 av 為空,則返回 -1;否則返回當前在 av 中定義的所有數組元素的索引的最大值。它不處理魔法,因此在其名稱中有 p 私有標記。

    SSize_t  AvFILLp(AV* av)
av_new_alloc

這實現了 perlapi 中的 "newAV_alloc_x"perlapi 中的 "newAV_alloc_xz",這些是此功能的公共 API。

創建一個新的 AV 並分配其 SV* 數組。

這與執行相似,但效率更高:

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

大小參數用於預先分配足夠大的 SV* 數組,以容納至少元素 0..(size-1)size 必須至少為 1。

zeroflag 參數控制數組是否為 NULL 初始化。

    AV *  av_new_alloc(SSize_t size, bool zeroflag)
av_store_simple

這是 av_store 的簡化版本,假設數組非常簡單 - 沒有任何魔法,不是只讀的,而且是 AvREAL - 並且 key 不是負數。在這些假設可能不成立的情況下,絕對不應該使用此函數。

將 SV 存儲在數組中。數組索引由 key 指定。可以對其進行解引用,以獲取存儲在那裡的 SV*(= val)。

注意,在調用之前,調用方負責適當地增加 val 的引用計數。

Perl 的近似等效: splice(@myarray, $key, 1, $val)

    SV **  av_store_simple(AV *av, SSize_t key, SV *val)

回調函數

dowantarray

已棄用!計劃在未來的 Perl 版本中移除 dowantarray。不要在新代碼中使用它;從現有代碼中刪除它。

實現了已棄用的 "GIMME" in perlapi

    U8  dowantarray()
leave_scope

實現了 LEAVE_SCOPE,您應該使用它。

    void  leave_scope(I32 base)
magic_freedestruct

此函數通過魔法調用以實現 mortal_destructor_sv()mortal_destructor_x() 函數。不應直接調用此函數,並且沒有任何用戶可維護的部分。

    int  magic_freedestruct(SV *sv, MAGIC *mg)
mortal_svfunc_x

此函數安排在 當前語句結束時 調用一個 C 函數引用,並提供所需的參數。它是 mortal_destructor_sv() 的包裝器,確保後者被適當地調用。

請注意,在 當前語句結束時當前虛假區塊結束時 之間存在顯著的時間差異。如果您正在尋找一種在 當前虛假區塊結束時 觸發函數的機制,則應該查看而不是此函數。

    void  mortal_svfunc_x(SVFUNC_t f, SV *p)
pop_scope

實現了 "LEAVE" in perlapi

    void  pop_scope()
push_scope

在 perlapi 中實現 "ENTER"。

    void  push_scope()
save_adelete

實現 SAVEADELETE

    void  save_adelete(AV *av, SSize_t key)
save_freercpv

實現 SAVEFREERCPV

保存並釋放引用計數的字符串。當當前偽塊完成時,將調用 rcpv_free()。

    void  save_freercpv(char *rcpv)
save_generic_pvref

實現 SAVEGENERICPV

類似於 save_pptr(),但如果新值與舊值不同,還會 Safefree() 新值。可用於將全局 char* 恢復為其先前內容,釋放新值。

    void  save_generic_pvref(char **str)
save_generic_svref

實現 SAVEGENERICSV

類似於 save_sptr(),但還會 SvREFCNT_dec() 新值。可用於將全局 SV 恢復為其先前內容,釋放新值。

    void  save_generic_svref(SV **sptr)
save_hdelete

實現 SAVEHDELETE

    void  save_hdelete(HV *hv, SV *keysv)
save_hints

實現 SAVEHINTS

    void  save_hints()
save_op

實現 SAVEOP

    void  save_op()
save_padsv_and_mortalize

實現 SAVEPADSVANDMORTALIZE

    void  save_padsv_and_mortalize(PADOFFSET off)
save_pushptr

將對象 ptr 的引用計數在當前偽塊結束時減少。 type 表示 ptr 的類型,表示為 scope.h 中以 SAVEt_ 開頭的常量之一。

這是幾個宏的基礎實現,如 SAVEFREESV

    void  save_pushptr(void * const ptr, const int type)
save_rcpv

實現 SAVERCPV

保存並恢復引用計數的字符串,類似於 save_generic_svref 對 SV* 做的操作。可用於將引用計數的字符串恢復為其以前的狀態。執行適當的引用計數計算,以確保沒有泄漏或過早釋放。

    void  save_rcpv(char **prcpv)
save_scalar_at

用於區域化由 *sptr 引用的 SV 的輔助函數。

如果在 flags 中設置了 SAVEf_KEEPOLDELEM,則該函數將返回原始的標量。

否則,它將使用新的undef標量替換*sptr,並返回該標量。新的標量將複製舊的魔法(如果有的話)。如果有這樣的魔法,並且在flags中設置了SAVEf_SETMAGIC,則將對新標量執行 'set' 魔法。如果未設置,將跳過 'set' 魔法。後者通常意味著很快將會有賦值操作(例如,'local $x = $y'),然後這將處理魔法。

    SV *  save_scalar_at(SV **sptr, const U32 flags)
save_set_svflags

實現SAVESETSVFLAGS

將由遮罩指定的SvFLAGS設置為val中的值

    void  save_set_svflags(SV *sv, U32 mask, U32 val)
save_shared_pvref

實現SAVESHAREDPV

類似於save_generic_pvref(),但使用PerlMemShared_free()而不是Safefree()。可用於將共享全局char*恢復到其先前的內容,釋放新值。

    void  save_shared_pvref(char **str)
save_vptr

實現SAVEVPTR

    void  save_vptr(void *ptr)

轉換

目前在轉換中沒有內部API項目

字符大小寫轉換

目前在字符大小寫轉換中沒有內部API項目

字符分類

目前在字符分類中沒有內部API項目

編譯器和預處理器信息

目前在編譯器和預處理器信息中沒有內部API項目

編譯器指令

目前在編譯器指令中沒有內部API項目

編譯時作用域鉤子

BhkENTRY

注意:BhkENTRY實驗性的,可能會在不通知的情況下更改或移除。

從BHK結構返回一個條目。which是一個預處理器標記,指示返回哪個條目。如果未設置相應的標誌,則會返回NULL。返回值的類型取決於您請求的條目。

    void *  BhkENTRY(BHK *hk, token which)
BhkFLAGS

注意:BhkFLAGS實驗性的,可能會在不通知的情況下更改或移除。

傳回 BHK 的旗標。

    U32  BhkFLAGS(BHK *hk)
CALL_BLOCK_HOOKS

注意:CALL_BLOCK_HOOKS實驗性的,可能會在不事先通知的情況下更改或移除。

呼叫所有已註冊的區塊鉤子,用於類型 whichwhich 是一個預處理標記;arg 的類型取決於 which

    void  CALL_BLOCK_HOOKS(token which, arg)

並行性

CVf_SLABBED
CvROOT
CvSTART

perlguts中有描述。

CX_CUR

perlguts中有描述。

    CX_CUR()
CXINC

perlguts中有描述。

CX_LEAVE_SCOPE

perlguts中有描述。

    void  CX_LEAVE_SCOPE(PERL_CONTEXT* cx)
CX_POP

perlguts中有描述。

    void  CX_POP(PERL_CONTEXT* cx)
cxstack

perlguts中有描述。

cxstack_ix

perlguts中有描述。

CXt_BLOCK
CXt_EVAL
CXt_FORMAT
CXt_GIVEN
CXt_LOOP_ARY
CXt_LOOP_LAZYIV
CXt_LOOP_LAZYSV
CXt_LOOP_LIST
CXt_LOOP_PLAIN
CXt_NULL
CXt_SUB
CXt_SUBST
CXt_WHEN

perlguts中有描述。

cx_type

perlguts中有描述。

dounwind

perlguts中有描述。

    void  dounwind(I32 cxix)
my_fork

這是用於將 PerlProc_fork 作為 C 库 fork(2) 在某些平台上的封裝器,以隱藏一些平台特異性的使用。它不應該直接使用,除非通過 PerlProc_fork

    Pid_t  my_fork()
PERL_CONTEXT

perlguts中有描述。

COPs 和提示哈希

目前在 COPs 和提示哈希中沒有內部 API 項目。

自訂運算子

core_prototype

此函式將指定核心函式的原型分配給 sv,或者如果 svNULL,則分配給新的有限制生命期的 SV。它會返回修改後的 sv,如果核心函式沒有原型則返回 NULLcode 是由 keyword() 返回的代碼。它不能等於 0。

    SV *  core_prototype(SV *sv, const char *name, const int code,
                         int * const opnum)

CV 處理

CvREFCOUNTED_ANYSV

若為真,表示 CvXSUBANY(cv).any_sv 成員包含一個 SV 指針,當 CV 本身被釋放時,其引用計數應該減少。此外,如果設置了此標誌,cv_clone() 會增加引用計數,sv_dup() 如果設置了此標誌,將複製整個指向的 SV。

任何包裹 XSUB 的 CV 都有一個 ANY 聯合,XSUB 函式可自由使用。可能的情況是代碼希望將 SV 存儲在此聯合的 any_sv 成員中。通過設置此標誌,當 CV 本身被回收或複製時,此 SV 引用將被妥善回收或複製。

    bool  CvREFCOUNTED_ANYSV(CV *cv)
CvREFCOUNTED_ANYSV_off

關閉 CvREFCOUNTED_ANYSV 標誌的輔助巨集。

    void  CvREFCOUNTED_ANYSV_off(CV *cv)
CvREFCOUNTED_ANYSV_on

打開 CvREFCOUNTED_ANYSV 標誌的輔助巨集。

    void  CvREFCOUNTED_ANYSV_on(CV *cv)
CvWEAKOUTSIDE

每個 CV 都有一個指針,CvOUTSIDE(),指向其語法上封閉的 CV(如果有的話)。因為將匿名子原型的指針存儲在 & 填充插槽中,可能會出現循環引用,父項指向子項,反之亦然。為了避免隨之而來的內存洩漏,我們在父項有一個指向我們的 & 填充插槽的情況下,在 特定的一個情況 中不增加由 CvOUTSIDE 指向的 CV 的引用計數。在這種情況下,我們在子項中設置了 CvWEAKOUTSIDE 標誌。這使我們能夠確定在何種情況下在釋放子項時我們應該減少父項的引用計數。

對於非閉包匿名子(即不引用任何在該子項之外的語法)存在進一步的問題。在這種情況下,匿名原型是共享的而不是被克隆的。這導致父項可能在仍然有活躍的子項時被釋放,例如,

BEGIN { $a = sub { eval '$x' } }

在這種情況下,由於沒有任何活動參考指向它,因此 BEGIN 在執行後立即被釋放:匿名子程式的原型設置了 CvWEAKOUTSIDE,因為它不是一個閉包,而 $a 指向相同的 CV,因此它也不會增加 BEGIN 的引用計數。當 $a 被執行時,eval '$x' 導致追蹤 CvOUTSIDE 鏈,並且被釋放的 BEGIN 被訪問。

為了避免這種情況,每當釋放一個 CV 及其相關的 pad 時,pad 中的任何 & 項目都會被明確地從 pad 中刪除,並且如果指向的匿名子程式的引用計數仍然為正,則該子代的 CvOUTSIDE 會被設置為指向其父代。這僅在一個特定情況下發生,即非閉包匿名原型具有一個或多個活動引用(如上面的 $a)時才會發生。

還要考慮的另一件事是,CV 可能僅僅是未定義的,而不是被釋放,例如 undef &foo。在這種情況下,它的引用計數可能尚未達到零,但我們仍然刪除它的 pad 和它的 CvROOT 等。由於各種子代仍然可能將它們的 CvOUTSIDE 指向這個未定義的 CV,我們暫時保留它自己的 CvOUTSIDE,以保持詞法範圍鏈的連續性。例如,以下內容應該打印 123

my $x = 123;
sub tmp { sub { eval '$x' } }
my $a = tmp();
undef &tmp;
print  $a->();
    bool  CvWEAKOUTSIDE(CV *cv)
docatch

介入,針對當前操作和 RUNOPS 循環,

- a new JMPENV stack catch frame, and
- an inner RUNOPS loop to run all the remaining ops following the
  current PL_op.

然後處理在該循環中引發的任何異常。對於此級別的捕獲 eval,使用指定的重啟操作(即 OP_LEAVETRY 之後的操作)重新進入循環;否則重新引發異常。

docatch() 預期用法如下

PP(pp_entertry)
{
    if (CATCH_GET)
        return docatch(Perl_pp_entertry);

    ... rest of function ...
    return PL_op->op_next;
}

如果不需要新的捕獲框架,則操作表現正常。否則,它調用 docatch(),後者遞歸調用 pp_entertry(),這次使用 CATCH_GET() 為 false,因此運行 entertry 餘下的內容。然後 docatch() 調用 CALLRUNOPS(),它執行所有 entertry 之後的操作。當循環最終完成時,控制返回到 docatch(),後者彈出 JMPENV 並返回到父 pp_entertry(),後者立即返回。請注意,*所有*後續操作都在內部 RUNOPS 循環中運行,而不僅僅是 eval 的主體。例如,在

sub TIEARRAY { eval {1}; my $x }
tie @a, "main";

在執行 'my' 的時候,C 堆棧會看起來像

#10 main()
#9  perl_run()              # JMPENV_PUSH level 1 here
#8  S_run_body()
#7  Perl_runops_standard()  # main RUNOPS loop
#6  Perl_pp_tie()
#5  Perl_call_sv()
#4  Perl_runops_standard()  # unguarded RUNOPS loop: no new JMPENV
#3  Perl_pp_entertry()
#2  S_docatch()             # JMPENV_PUSH level 2 here
#1  Perl_runops_standard()  # docatch()'s RUNOPs loop
#0  Perl_pp_padsv()

基本上,perl 核心的任何部分開始一個 RUNOPS 循環都可以承諾捕獲任何異常並在必要時重新啟動循環。如果它沒有準備好這樣做(例如 call_sv() 沒有這樣做),則將 CATCH_GET() 設置為 true,以便稍後的類似 eval 的代碼知道設置新的處理程序和循環(通過 docatch())。

請參閱 "perlinterp 中的異常處理" 以獲取更多詳細信息。

    OP *  docatch(Perl_ppaddr_t firstpp)

偵錯

comma_aDEPTH

在 DEBUGGING 模式下編譯的某些函數會多接受一個額外的最終參數,名為 depth,表示 C 堆疊深度。否則會省略此參數。此宏在 DEBUGGING 模式下會展開為 ,depth,在非 DEBUGGING 模式下則不展開,以減少代碼中的 #ifdef

程序負責維護正確的 depth 值。

    comma_aDEPTH
comma_pDEPTH

用於接受一個"comma_aDEPTH" 最終參數的函數原型聲明,類似於接受線程上下文初始參數的函數使用 pTHX_

debop

在 OP o 上實現 -Dt perl 命令行選項。

    I32  debop(const OP *o)
debprof

用於指示已執行 o,以便在 -DP 命令行選項下進行分析。

    void  debprof(const OP *o)
debprofdump

將由 -DP perl 命令行選項收集的數據內容轉儲。

    void  debprofdump()
debug_aDEPTH

"comma_aDEPTH"相同,但沒有前導參數。用於沒有常規參數的函數,並被"comma_aDEPTH"本身使用。

    debug_aDEPTH
debug_pDEPTH

"comma_pDEPTH"相同,但沒有前導參數。用於沒有常規參數的函數,並被"comma_pDEPTH"本身使用。

    debug_pDEPTH
free_c_backtrace

釋放從 get_c_backtrace 接收的回溯。

    void  free_c_backtrace(Perl_c_backtrace *bt)
get_c_backtrace

將回溯(又稱“堆疊跟踪”)收集到單個線性 malloced 緩衝區中,調用者必須Perl_free_c_backtrace()

通過depth + skip掃描框架,然後刪除最內層的skip,最多返回depth框架。

    Perl_c_backtrace *  get_c_backtrace(int max_depth, int skip)
PL_DBsingle

當 Perl 在調試模式下運行時,使用-d開關,此 SV 是一個布林值,表示是否正在逐步執行子程序。在每個步驟之後,逐步執行都會自動打開。這是對應於 Perl 的 $DB::single 變量的 C 變量。參見"PL_DBsub"

在具有線程的 Perl 中,每個線程都有此變數的獨立副本;在創建時,每個副本都以創建線程的當前值初始化。

    SV *  PL_DBsingle
PL_DBsub

當以調試模式運行 Perl,使用 -d 開關時,此 GV 包含持有正在進行調試的子例程名稱的 SV。這是對應於 Perl 的 $DB::sub 變數的 C 變數。請參閱 "PL_DBsingle"

在具有線程的 Perl 中,每個線程都有此變數的獨立副本;在創建時,每個副本都以創建線程的當前值初始化。

    GV *  PL_DBsub
PL_DBtrace

當以調試模式運行 Perl,使用 -d 開關時使用的跟踪變數。這是對應於 Perl 的 $DB::trace 變數的 C 變數。請參閱 "PL_DBsingle"

在具有線程的 Perl 中,每個線程都有此變數的獨立副本;在創建時,每個副本都以創建線程的當前值初始化。

    SV *  PL_DBtrace
runops_debug

perlguts中有描述。

    int  runops_debug()
runops_standard

perlguts中有描述。

    int  runops_standard()

顯示函數

sv_peek

實現 SvPEEK

    char *  sv_peek(SV *sv)

嵌入、線程和解釋器克隆

cv_dump

轉儲 CV 的內容

    void  cv_dump(const CV *cv, const char *title)
cv_forget_slab

當 CV 在其板上具有引用計數(CvSLABBED)時,它負責確保它被釋放。 (因此,兩個 CV 永遠不應該在同一塊板上具有引用計數。)CV 只需要在編譯期間引用板。一旦它編譯完成並且附加了 CvROOT,它就完成了其工作,因此可以忘記板。

    void  cv_forget_slab(CV *cv)
do_dump_pad

轉儲 padlist 的內容

    void  do_dump_pad(I32 level, PerlIO *file, PADLIST *padlist,
                      int full)
get_context

實現 perlapi 中的 "PERL_GET_CONTEXT",您應該使用它。

    void *  get_context()
pad_alloc_name

在當前編譯的 pad 中分配一個位置(通過 perlapi 中的 "pad_alloc")然後為該項目存儲名稱。 name 被採納並成為名稱項目;它必須已經包含名稱字符串。 typestashourstash 以及 padadd_STATE 標誌被添加到 name 中。不會進行 perlapi 中的 "pad_add_name_pvn" 的其他處理。返回分配的 pad 槽的偏移量。

    PADOFFSET  pad_alloc_name(PADNAME *name, U32 flags, HV *typestash,
                              HV *ourstash)
pad_block_start

在進入新塊時更新 pad 編譯狀態變數。

    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

在嵌套的 pad 鏈中找到具名的語彙。如果在外部找到,則在內部的 pad 中添加虛擬項目。

返回 lex 或虛擬 lex 在底層 pad 中的偏移。 cv 是開始搜索的 CV,seq 是要匹配的當前 cop_seq。如果 warn 為 true,則打印相應的警告。 out_* 變數返回值,因此是指向返回值應存儲的位置的指針。如果 out_capture 為非空,則請求捕獲語彙的最內層實例;out_name 設置為最內層匹配的 pad 名稱或虛擬 pad 名稱;out_flags 返回與虛擬 pad 名稱的 PARENT_FAKELEX_FLAGS 字段通常關聯的標誌。

請注意,pad_findlex() 是遞歸的;它向上遞歸到 CV 鏈,然後返回,添加虛擬條目。必須這樣做,因為匿名原型中的虛擬名稱必須在 xpadn_low 中存儲對父 pad 的索引。

    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

對於 pad 中的任何匿名 CV,如果需要,將該 CV 的 CvOUTSIDEold_cv 更改為 new_cv。當新編譯的 CV 必須移動到預先存在的 CV 結構時需要。

    void  pad_fixup_inner_anons(PADLIST *padlist, CV *old_cv,
                                CV *new_cv)
pad_free

釋放當前 pad 中偏移為 po 的 SV。

    void  pad_free(PADOFFSET po)
pad_leavemy

編譯結束時的清理:設置該作用域中語彙的最大序列號,並警告任何未被引入的語彙。

    OP *  pad_leavemy()
padlist_dup

複製 pad。

    PADLIST *  padlist_dup(PADLIST *srcpad, CLONE_PARAMS *param)
padname_dup

複製 pad 名稱。

    PADNAME *  padname_dup(PADNAME *src, CLONE_PARAMS *param)
padnamelist_dup

複製 pad 名稱列表。

    PADNAMELIST *  padnamelist_dup(PADNAMELIST *srcpad,
                                   CLONE_PARAMS *param)
pad_push

將新的 pad 框推送到 padlist 上,除非已經存在該深度的 pad,在這種情況下不要創建新的。然後在 slot zero 中給新的 pad 一個 @_

    void  pad_push(PADLIST *padlist, int depth)
pad_reset

標記所有當前的臨時變量以便重用

    void  pad_reset()
pad_setsv

在當前(編譯或執行)的 pad 中設置偏移為 po 的值。請使用宏 PAD_SETSV() 而不是直接調用此函數。

    void  pad_setsv(PADOFFSET po, SV *sv)
pad_sv

獲取當前(編譯或執行)的 pad 中偏移為 po 的值。請使用宏 PAD_SV 而不是直接調用此函數。

    SV *  pad_sv(PADOFFSET po)
pad_swipe

在偏移 po 的當前 pad 中放棄 tmp,並以新的取代之。

    void  pad_swipe(PADOFFSET po, bool refadjust)
set_context

實現 "PERL_SET_CONTEXT" 在 perlapi 中,應改用此。

    void  set_context(void *t)
si_dup

複製一個堆疊資訊結構,返回指向克隆對象的指針。

    PERL_SI *  si_dup(PERL_SI *si, CLONE_PARAMS *param)
ss_dup

複製保存堆疊,返回指向克隆對象的指針。

    ANY *  ss_dup(PerlInterpreter *proto_perl, CLONE_PARAMS *param)

Errno

dSAVEDERRNO

聲明保存 errno 和任何操作系統特定錯誤號碼所需的變量。

    void  dSAVEDERRNO
dSAVE_ERRNO

聲明保存 errno 和任何操作系統特定錯誤號碼所需的變量,並將它們保存以供稍後由 RESTORE_ERRNO 選擇性還原。

    void  dSAVE_ERRNO
RESTORE_ERRNO

還原由 dSAVE_ERRNORESTORE_ERRNO 保存的 errno 和任何操作系統特定錯誤號碼。

    void  RESTORE_ERRNO
SAVE_ERRNO

保存 errno 和任何操作系統特定錯誤號碼以供稍後由 RESTORE_ERRNO 選擇性還原。 需要範圍內有 dSAVEDERRNOdSAVE_ERRNO

    void  SAVE_ERRNO
SETERRNO

設置 errno,在 VMS 上設置 vaxc$errno

    void  SETERRNO(int errcode, int vmserrcode)

異常處理(簡單)宏

當前沒有異常處理(簡單)宏中的內部 API 項目

檔案系統配置值

當前沒有檔案系統配置值中的內部 API 項目

浮點數

當前沒有浮點數中的內部 API 項目

一般配置

當前沒有一般配置中的內部 API 項目

全局變量

當前沒有全局變量中的內部 API 項目

GV 處理和存儲

amagic_applies

檢查 sv 是否適用於重載(活動魔法)操作 method。 如果 sv 不是 SvROK 或不是對象,則返回 false,否則檢查對象是否被祝福為支持重載操作的類,如果調用 amagic_call() 與此 SV 和給定的方法將觸發一個 amagic 操作,包括通過重載回退規則或通過 nomethod。 因此,像這樣的調用

amagic_applies(sv, string_amg, AMG_unary)

對於以以下任何方式設置過載的物件,會返回 true:

use overload q("") => sub { ... };
use overload q(0+) => sub { ... }, fallback => 1;

可以用來判斷特定物件是否會將字串化為非常規的預設參考字串。

請注意,此函式返回 TRUE 不代表您可以成功執行 amagic_call() 操作,例如任何已過載的方法可能會拋出致命異常,但是如果此函式返回 FALSE,則可以確信它不會執行給定的過載操作。

method 是一個整數枚舉值,在 overload.h 中可以找到,例如 string_amg

flags 應該設置為 AMG_unary 以進行一元操作。

    bool  amagic_applies(SV *sv, int method, int flags)
gp_dup

複製一個 typeglob,返回克隆對象的指針。

    GP *  gp_dup(GP * const gp, CLONE_PARAMS * const param)
gv_handler

實現 StashHANDLER,您應該使用此功能。

    CV *  gv_handler(HV *stash, I32 id)
gv_stashsvpvn_cached

返回指定封包的stash的指針,可能已經緩存。實現了 "gv_stashpvn" 在 perlapi 中"gv_stashsv" 在 perlapi 中

要求 namesvnamepv 其中之一不為空。

如果設置了標誌 GV_CACHE_ONLY,則僅在緩存中找到時返回 stash;有關其他 flags 的詳細信息,請參閱 "gv_stashpvn" 在 perlapi 中

基於性能原因,強烈建議 namesv 不為空。

    HV *  gv_stashsvpvn_cached(SV *namesv, const char *name,
                               U32 namelen, I32 flags)
gv_try_downgrade

注意:gv_try_downgrade實驗性的,可能會在未通知的情況下更改或刪除。

如果 typeglob gv 可以更簡潔地表示,而不是在 stash 中放置一個真實的 GV,則用優化的形式替換它。此功能的基本要求是,gv 是一個真實的 typeglob,足夠普通,並且只從其封包中引用。當部分查找了 GV 以查看其中的內容,導致升級,但根據找到的內容,結果發現實際上不需要真實的 GV 時,應使用此函式。

如果gv是完全空的类型全局变量,则将其从存储中删除。

如果gv只包含一个足够普通的常量子类型全局变量,则将该类型全局变量替换为更紧凑表示相同内容的标量引用占位符。

    void  gv_try_downgrade(GV *gv)

挂钩操作

目前在挂钩操作中没有内部 API 项目。

HV 处理

hv_eiter_p

实现HvEITER,您应该使用它。

注意:hv_eiter_p必须显式调用为Perl_hv_eiter_p,带有aTHX_参数。

    HE **  Perl_hv_eiter_p(pTHX_ HV *hv)
hv_eiter_set

实现HvEITER_set,您应该使用它。

注意:hv_eiter_set必须显式调用为Perl_hv_eiter_set,带有aTHX_参数。

    void  Perl_hv_eiter_set(pTHX_ HV *hv, HE *eiter)
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)
hv_fill

返回正在使用的哈希桶的数量。

此函数实现了您应该使用的HvFILL

从 perl 5.25 开始,此函数仅用于调试目的,并且所使用的哈希桶的数量没有以任何方式被缓存,因此此函数执行起来可能成本较高,因为它必须遍历哈希中的所有桶。

注意:hv_fill必须显式调用为Perl_hv_fill,带有aTHX_参数。

    STRLEN  Perl_hv_fill(pTHX_ HV * const hv)
hv_placeholders_get

实现HvPLACEHOLDERS_get,您应该使用它。

注意:hv_placeholders_get必须显式调用为Perl_hv_placeholders_get,带有aTHX_参数。

    I32  Perl_hv_placeholders_get(pTHX_ const HV *hv)
hv_placeholders_set

实现HvPLACEHOLDERS_set,您应该使用它。

注意:hv_placeholders_set必须显式调用为Perl_hv_placeholders_set,带有aTHX_参数。

    void  Perl_hv_placeholders_set(pTHX_ HV *hv, I32 ph)
hv_riter_p

实现HvRITER,您应该使用它。

注意:hv_riter_p必须显式调用为Perl_hv_riter_p,带有aTHX_参数。

    I32 *  Perl_hv_riter_p(pTHX_ HV *hv)
hv_riter_set

實現 HvRITER_set,您應該改用此函數。

注意:hv_riter_set 必須顯式地作為帶有 aTHX_ 參數的 Perl_hv_riter_set 被呼叫。

    void  Perl_hv_riter_set(pTHX_ HV *hv, I32 riter)
refcounted_he_chain_2hv

生成並返回代表 refcounted_he 鏈的內容的 HV *。目前未使用 flags,必須為零。

    HV *  refcounted_he_chain_2hv(const struct refcounted_he *c,
                                  U32 flags)
refcounted_he_fetch_pv

類似於 "refcounted_he_fetch_pvn",但接受以 null 結尾的字符串而不是字符串/長度對。

    SV *  refcounted_he_fetch_pv(const struct refcounted_he *chain,
                                 const char *key, U32 hash, U32 flags)
refcounted_he_fetch_pvn

沿著 refcounted_he 鏈搜索由 keypvkeylen 指定的鍵的條目。如果 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,
                                  "key", U32 flags)
refcounted_he_fetch_sv

類似於 "refcounted_he_fetch_pvn",但接受 Perl 标量而不是字符串/長度對。

    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",但接受以 null 結尾的字符串而不是字符串/長度對。

    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 鏈的引用(可能為空),因此形成了一個更長的鏈。使用較長的鏈時,新的鍵/值對優先於鏈中更深處的相同鍵的任何條目。

新的金鑰由keypvkeylen指定。如果flags設置了REFCOUNTED_HE_KEY_UTF8位元,則將金鑰位元視為UTF-8;否則將其視為Latin-1。 hash是金鑰字符串的預先計算哈希值,如果尚未預先計算,則為零。

value是要存儲給此鍵的純量值。此函數會複製value,因此不會擁有對其的任何引用,以後對純量的更改將不會反映在refcounted_he中可見的值中。不會將複雜類型的純量以引用完整性形式存儲,而是會強制轉換為字符串。 value可以是null或&PL_sv_placeholder,表示不與該鍵關聯任何值;與鏈中後續的鍵的值的存在相比,這與任何非null值一樣優先。

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,
                                         "key", SV *value, U32 flags)
refcounted_he_new_sv

類似於"refcounted_he_new_pvn",但使用Perl純量而不是字符串/長度對。

    struct refcounted_he *  refcounted_he_new_sv(
                                         struct refcounted_he *parent,
                                         SV *key, U32 hash, SV *value,
                                         U32 flags)
unsharepvn

如果沒有人訪問具有長度len的共享字符串str,則將其釋放。

lenhash必須對str都有效。

    void  unsharepvn(const char *sv, I32 len, U32 hash)

輸入/輸出

dirp_dup

復制目錄句柄,返回克隆對象的指針。

    DIR *  dirp_dup(DIR * const dp, CLONE_PARAMS * const param)
fp_dup

復制文件句柄,返回克隆對象的指針。

    PerlIO *  fp_dup(PerlIO * const fp, const char type,
                     CLONE_PARAMS * const param)
my_fflush_all

在某些平台上實現PERL_FLUSHALL_FOR_CHILD

    I32  my_fflush_all()
my_mkostemp

如果可用,則是C庫mkostemp(3),否則是其Perl實現。

注意:my_mkostemp必須明確調用為Perl_my_mkostemp

    int  Perl_my_mkostemp(char *templte, int flags)
my_mkstemp

如果可用,則是C庫mkstemp(3),否則是其Perl實現。

注意:my_mkstemp必須明確調用為Perl_my_mkstemp

    int  Perl_my_mkstemp(char *templte)
PL_last_in_gv

用於文件處理程序輸入操作(<FH>)的上一次使用的GV。

在具有線程的 Perl 中,每個線程都有此變數的獨立副本;在創建時,每個副本都以創建線程的當前值初始化。

    GV*  PL_last_in_gv
PL_ofsgv

包含輸出字段分隔符*,的glob - 在Perl空間中。

在具有線程的 Perl 中,每個線程都有此變數的獨立副本;在創建時,每個副本都以創建線程的當前值初始化。

    GV*  PL_ofsgv
PL_rs

輸入記錄分隔符 - 在Perl空間中的$/

在具有線程的 Perl 中,每個線程都有此變數的獨立副本;在創建時,每個副本都以創建線程的當前值初始化。

    SV*  PL_rs
start_glob

注意:start_glob實驗性功能,可能會在不通知的情況下更改或刪除。

do_readline調用的函數,用於生成一個glob(或在VMS上在perl內部進行glob)。此代碼曾經是內聯的,但現在perl使用File::Glob,這個glob起始器僅在miniperl在構建過程中使用,或者當定義了PERL_EXTERNAL_GLOB時使用。將其移開將縮小pp_hot.c;縮小pp_hot.c有助於加快perl速度。

注意:start_glob必須明確地作為Perl_start_glob呼叫,並帶有aTHX_參數。

    PerlIO *  Perl_start_glob(pTHX_ SV *tmpglob, IO *io)

整數

整數中目前沒有內部API項目

輸入/輸出格式

輸入/輸出格式中目前沒有內部API項目

語法分析器接口

resume_compcv_and_save

恢復先前由suspend_compcv函數暫停的緩衝區,以一種在範圍結束時將其重新暫停以便稍後再次使用的方式。這應該在ENTER/LEAVE作用域對中使用。

    void  resume_compcv_and_save(struct suspended_compcv *buffer)
resume_compcv_final

在最後一次被編譯為完整CV之前,恢復先前使用suspend_compcv函數保存的解析器狀態。這應該在ENTER/LEAVE作用域對中使用。

    void  resume_compcv_final(struct suspended_compcv *buffer)
validate_proto

注意:validate_proto實驗性功能,可能會在不通知的情況下更改或刪除。

此函數對原型proto執行語法檢查。如果warn為真,任何非法字符或不匹配的括號都將觸發illegalproto警告,聲明它們在name的原型中被檢測到。

返回值為true,如果這是一個有效的原型,則返回false,無論warntrue還是false

請注意,NULL是一個有效的proto,並且將始終返回true

    bool  validate_proto(SV *name, SV *proto, bool warn,
                         bool curstash)

區域設置

目前在地域中沒有內部 API 項目

魔法

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)。

svmg 是被綁定的東西和綁定的魔法。

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

注意:magic_methcall必須作為帶有aTHX_參數的Perl_magic_methcall顯式調用。

    SV *  Perl_magic_methcall(pTHX_ 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_dup

從一個魔法鏈中複製,返回克隆對象的指針。

    MAGIC *  mg_dup(MAGIC *mg, CLONE_PARAMS * const param)
mg_localize

將現有 SV 的一些魔法複製到該 SV 的新本地化版本。容器魔法(例如%ENV$1tie)被複製,值魔法不被複製(例如taintpos)。

如果setmagic為false,則新(空)SV 上將不調用設置魔法。這通常意味著很快就會進行賦值(例如,'local $x = $y'),那將處理魔法。

    void  mg_localize(SV *sv, SV *nsv, bool setmagic)

內存管理

calloc

實現了perlapi中的“Newxz,您應該改用該函數。

注意:calloc必須作為Perl_calloc顯式調用。

    Malloc_t  Perl_calloc(MEM_SIZE elements, MEM_SIZE size)
malloc

實現了perlapi中的“Newx,您應該改用該函數。

注意:必須明確呼叫 mallocPerl_malloc

    Malloc_t  Perl_malloc(MEM_SIZE nbytes)
mfree

實現了perlapi 中的 "Safefree",您應該改用此函式。

注意:必須明確呼叫 mfreePerl_mfree

    Free_t  Perl_mfree(Malloc_t where)
realloc

實現了perlapi 中的 "Renew",您應該改用此函式。

注意:必須明確呼叫 reallocPerl_realloc

    Malloc_t  Perl_realloc(Malloc_t where, MEM_SIZE nbytes)

MRO

mro_get_linear_isa_dfs

返回給定 stash 的深度優先搜索線性化的 @ISA。返回值是一個只讀的 AV*,其元素是字符串 SV,給出類名。level 應為 0(在此函式的遞迴中內部使用)。

如果您計劃將其存儲在任何半永久位置(否則可能在下次快取失效時被刪除),您負責對返回值進行 SvREFCNT_inc()

    AV *  mro_get_linear_isa_dfs(HV *stash, U32 level)
mro_isa_changed_in

在給定包的 @ISA 已更改時採取必要步驟(主要是快取失效)。由 setisa magic 調用,不應直接調用。

    void  mro_isa_changed_in(HV *stash)
mro_package_moved

調用此函式以向 stash 發出信號,指示其已分配給 stash 階層中的另一個位置。stash 是已分配的 stash。oldstash 是其替換的 stash(如果有)。gv 是實際分配的 glob。

也可以使用空第一個參數調用此函式,以指示 oldstash 已被刪除。

此函式使舊 stash 上的 isa 快取、所有其內部的所有子包以及所有這些子包的子類的 isa 快取無效,包括在 stash 中具有相應條目的不存在的包。

它還根據需要設置所有 stash 的有效名稱(HvENAME)。

如果 gv 存在且不在符號表中,則此函式僅返回。如果 flags & 1,則將跳過此檢查。

    void  mro_package_moved(HV * const stash, HV * const oldstash,
                            const GV * const gv, U32 flags)

多重調用函式

目前多重調用函式中沒有內部 API 項目。

數值函數

isinfnansv

檢查當用作數字時,引數是否會是無窮大或 NaN,但注意不要觸發非數字或未初始化警告。它假設調用者已經執行了 SvGETMAGIC(sv)

請注意,這始終接受尾隨的垃圾(類似於帶有 PERL_SCAN_TRAILINGgrok_number_flags),因此 "inferior""NAND gates" 將返回 true。

    bool  isinfnansv(SV *sv)

優化樹

newATTRSUB_x

構造一個 Perl 子例程,同時執行一些周邊工作。

預期在 Perl 編譯上下文中調用此函數,並且子例程的某些方面是從與編譯相關的全局變量中取得的。特別地,PL_compcv 代表當前正在編譯的子例程。在調用此函數時,它必須為非空,並且正在構造的子例程的某些方面是從它那裡取得的。實際構造的子例程可能是 PL_compcv 對象的重複使用,但不一定如此。

如果 block 為空,則子例程將沒有主體,目前呼叫它會產生錯誤。這表示一個前向子例程聲明,例如 sub foo ($$);。如果 block 不為空,則它提供子例程主體的 Perl 代碼,當呼叫子例程時將執行該代碼。此主體包括由子例程簽名或類似結果產生的任何參數解包代碼。代碼的 pad 使用必須對應到附加到 PL_compcv 的 pad。代碼不應包含 leavesubleavesublv op;此函數將添加此類 op。block 將被此函數消耗並成為構造的子例程的一部分。

proto 指定了子程式的原型,除非作為屬性提供(見下文)。如果 proto 為 null,則該子程式將沒有原型。如果 proto 不為 null,則它必須指向一個值為字符串的 const op,並且子程式將具有該字符串作為其原型。如果原型作為屬性提供,則該屬性優先於 proto,但在這種情況下,proto 最好為 null。在任何情況下,proto 都將被此函數消耗。

attrs 提供要應用於子程式的屬性。一些屬性通過內置方式生效,當見到時立即應用於 PL_compcv。其他屬性則通過此路由被收集並附加到子程式上。attrs 可為 null 以不提供任何屬性,或者指向一個 const op 以提供單個屬性,或者指向一個 list op,其子元素除了 pushmark 外都是一個或多個屬性的 const ops。每個 const op 必須是一個字符串,給出屬性名稱,可選地後跟帶括號的參數,以 Perl 源代碼中屬性出現的方式。這些屬性將被此函數應用於子程式。attrs 將被此函數消耗。

如果 o_is_gv 為 false,並且 o 為 null,則該子程式將是匿名的。如果 o_is_gv 為 false,並且 o 不為 null,則 o 必須指向一個 const OP,該 OP 將被此函數消耗,並且其字符串值提供子程式的名稱。名稱可以是合格的或不合格的,如果是不合格的,則某種方式將選擇默認存儲區。如果 o_is_gv 為 true,則 o 不指向任何 OP,而是一個轉換指針,通過該指針將子程式命名為 GV

如果已經存在指定名稱的子程式,則新的子程式將取代現有的子程式或與現有的子程式合併。可能會生成有關重新定義的警告。

如果子程式具有特定的幾個名稱之一,例如 BEGINEND,則它將被相應隊列認領以自動運行與階段相關的子程式。在這種情況下,相關的 glob 將不包含任何子程式,即使它在此之前包含了一個子程式也是如此。在 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為空則無原型。原型字符串將被複製;調用者可以在此後更改提供的字符串。如果filename為非空,則它必須是一個空終止的文件名,並且子程將相應地設置其CvFILE。默認情況下,CvFILE被設置為直接指向提供的字符串,該字符串必須是靜態的。如果flags設置了XS_DYNAMIC_FILENAME位,則將採取字符串的副本。

子程的其他方面將保持其默認狀態。如果需要對子程進行其他操作以使其正常工作,則由調用者負責在此函式構建它之後執行該操作。但是,請注意在此函式返回之前子程可能已被銷毀,如下所述。

如果name為空,則該子程將是匿名的,其CvGV將參考到一個__ANON__全局變量。如果name不為空,則該子程將相應地命名,由相應的全局變量引用。name是一個長度為len字節的字符串,給出無符號符號名稱,如果flags設置了SVf_UTF8位則使用 UTF-8,否則使用 Latin-1。名稱可以是合格的或不合格的,對於gv_fetchpvn_flags,預設情況下的暫存將默認為相同方式的預設情況。 flags可以包含被gv_fetchpvn_flags理解的標誌位,其含義與那裡的含義相同,例如GV_ADDWARN。如果需要,該符號將始終添加到暫存中,並具有GV_ADDMULTI語義。

如果已經存在指定名稱的子程序,則新的子程序將取代全域中的現有子程序。可能會生成有關重新定義的警告。如果舊的子程序是 CvCONST,則是否發出警告的決定取決於新的子程序是否會成為具有類似值的常數的預期。該預期由 const_svp 確定。(請注意,對此函數的調用在任何情況下都不會將新的子程序設置為 CvCONST;這由調用方決定。)如果 const_svp 為 null,則表示新的子程序將不會成為常數。如果 const_svp 為非空,則表示新的子程序將成為常數,並且它指向一個 SV*,該指針提供了子程序將具有的常數值。

如果子程序具有一些特殊名稱之一,例如 BEGINEND,則將它們佇列給適當的階段相關子程序自動運行。在這種情況下,即使全域之前包含一個子程序,也會將相關的全域留空。對於 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)
op_refcnt_lock

實現 OP_REFCNT_LOCK 宏,您應該使用它。

    void  op_refcnt_lock()
op_refcnt_unlock

實現 OP_REFCNT_UNLOCK 宏,您應該使用它。

    void  op_refcnt_unlock()
traverse_op_tree

返回在遍歷操作樹的深度優先遍歷中的下一個操作,當遍歷完成時返回 NULL。

初始調用必須將樹的根作為 top 和 o 兩者供應。

目前它是靜態的,但將來可能會向 API 公開。

    OP *  traverse_op_tree(OP *top, OP *o)

打包和解包

目前打包和解包中沒有內部 API 項目

填充資料結構

CX_CURPAD_SAVE

將當前 pad 儲存在給定的上下文區塊結構中。

    void  CX_CURPAD_SAVE(struct context)
CX_CURPAD_SV

存取給定上下文區塊結構中已保存的當前墊片中偏移量po處的SV(可以用作lvalue)。

    SV *  CX_CURPAD_SV(struct context, PADOFFSET po)
PAD_BASE_SV

在padlist的基本(DEPTH=1)墊片中從槽位po獲取值。

    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

將當前ling墊片中偏移量po處名稱的生成號碼(lvalue)設置為gen

    STRLEN  PAD_COMPNAME_GEN_set(PADOFFSET po, int gen)
PAD_COMPNAME_OURSTASH

返回與our變量關聯的stash。假定槽位輸入是有效的ourlexical。

    HV *  PAD_COMPNAME_OURSTASH(PADOFFSET po)
PAD_COMPNAME_PV

返回偏移量po處當前編譯墊片名稱。假定有效的槽位輸入。

    char *  PAD_COMPNAME_PV(PADOFFSET po)
PAD_COMPNAME_TYPE

返回偏移量po處當前編譯墊片名稱的類型(stash)。必須是有效的名稱。如果未定型,則返回null。

    HV *  PAD_COMPNAME_TYPE(PADOFFSET po)
PadnameIsFIELD

這是否為“field”變量。如果PADNAME為true,則可以通過PadnameFIELDINFO獲得額外信息。

    bool  PadnameIsFIELD(PADNAME * pn)
PadnameIsOUR

這是否為“our”變量。

    bool  PadnameIsOUR(PADNAME * pn)
PadnameIsSTATE

這是否為“state”變量。

    bool  PadnameIsSTATE(PADNAME * pn)
PadnameOURSTASH

聲明此“our”變量的stash。

    HV *  PadnameOURSTASH(PADNAME * pn)
PadnameOUTER

此條目是否屬於外部墊片。這種情況下經常將其稱為“假”。

    bool  PadnameOUTER(PADNAME * pn)
PadnameTYPE

與類型化的語法結構相關聯的stash。這將返回%Foo::哈希給my Foo $bar

    HV *  PadnameTYPE(PADNAME * pn)
PAD_RESTORE_LOCAL

將保存在本地變量opad中的舊pad還原為PAD_SAVE_LOCAL()保存的舊pad。

    void  PAD_RESTORE_LOCAL(PAD *opad)
PAD_SAVE_LOCAL

將當前pad保存到本地變量opad,然後將當前pad設置為npad

    void  PAD_SAVE_LOCAL(PAD *opad, PAD *npad)
PAD_SAVE_SETNULLPAD

保存當前pad,然後將其設置為空。

    void  PAD_SAVE_SETNULLPAD()
PAD_SET_CUR

將當前pad設置為pad列表中的第n個pad,保存上一個當前pad。注意:目前此宏擴展為一個對某些編譯器來說太長的字符串,所以最好替換為

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_SETSV

將當前pad中偏移量po的槽設置為sv

    SV *  PAD_SETSV(PADOFFSET po, SV* sv)
PAD_SV

獲取當前pad中偏移量po的值。

    SV *  PAD_SV(PADOFFSET po)
PAD_SVl

PAD_SV的輕量級和lvalue版本。獲取或設置當前pad中偏移量po的值。與PAD_SV不同,不會使用-DX打印診斷信息。僅供內部使用。

    SV *  PAD_SVl(PADOFFSET po)
SAVECLEARSV

在作用域退出時清除指向的pad值。(即my的運行操作)

    void  SAVECLEARSV(SV **svp)
SAVECOMPPAD

保存PL_comppadPL_curpad

    void  SAVECOMPPAD()
SAVEPADSV

保存一個pad槽(用於迭代後恢復)。

    void  SAVEPADSV(PADOFFSET po)

密碼和群組訪問

目前在密碼和群組訪問中沒有內部API項目。

系統命令的路徑

目前在系統命令的路徑中沒有內部API項目。

原型信息

目前在原型信息中沒有內部API項目。

正則表達式函數

regnode

詳見perlreguts

報告與格式

目前報告與格式中沒有內部 API 項目

信號

目前信號中沒有內部 API 項目

網站配置

目前網站配置中沒有內部 API 項目

插座配置值

目前插座配置值中沒有內部 API 項目

源篩選器

目前源篩選器中沒有內部 API 項目

堆疊操作巨集

djSP

聲明僅為 SP。這與 dSP 完全相同,並聲明了 perl 堆疊指針的本地副本,可以通過 SP 巨集訪問。請參見 "perlapi" 中的 "SP"。(為與舊的(Perl 5.005)線程模型向後源代碼兼容而提供。)

    djSP();
LVRET

如果此操作將是左值子例程的返回值,則為真

save_alloc

實現了 perlapi 中的 "SSNEW" 等,應改用此函數。

    SSize_t  save_alloc(SSize_t size, I32 pad)

字符串處理

delimcpy_no_escape

將源緩衝區複製到目標緩衝區,停在源中第一次出現的分隔符字節(不包括)處。源是介於 fromfrom_end - 1 字節之間。同樣,目標是從 toto_end

複製的字節數寫入 *retlen

返回 from 緩衝區中的 delim 的位置,但如果在 from_end 之前沒有出現這樣的情況,則返回 from_end,並將整個緩衝區 from .. from_end - 1 複製。

如果在複製後目標中有空間可用,則附加一個額外的終端安全 NUL 字節(不包含在返回的長度中)。

錯誤情況是目的地緩衝區大小不足以容納應複製的所有內容。在這種情況下,將寫入大於 to_end - to 的值到 *retlen,並將盡可能多的源寫入目的地。不足以容納安全的 NUL 不被視為錯誤。

    char *  delimcpy_no_escape(char *to, const char *to_end,
                               const char *from, const char *from_end,
                               const int delim, I32 *retlen)
my_cxt_init

實現了 "MY_CXT_INIT" in perlxs 宏,應該使用這個宏。

模組首次加載時,全局的 PL_my_cxt_index 會增加,並將該值分配給該模組的靜態 my_cxt_index(其地址作為參數傳遞)。然後,對於每個調用此函數的解譯器,它都會確保有一個 void* 槽可用於掛載靜態數據,通過分配或擴展解譯器的 PL_my_cxt_list 數組

注意:my_cxt_init 必須顯式調用為帶有 aTHX_ 參數的 Perl_my_cxt_init

    void *  Perl_my_cxt_init(pTHX_ int *indexp, size_t size)
quadmath_format_needed

quadmath_format_needed() 如果 format 字符串似乎包含至少一個非 Q 前綴的 %[efgaEFGA] 格式指示符,則返回 true;否則返回 false。

格式指示符檢測不完整,但應該能檢測到大多數常見情況。

如果返回 true,則理論上這些參數應該使用 quadmath_snprintf() 處理,但如果有多個這樣的格式指示符(參見 "quadmath_format_valid"),並且如果還有其他任何內容(即使只是一個字節),則不能處理它們,因為 quadmath_snprintf() 非常嚴格,只接受一個格式指示符,不接受其他內容。在這種情況下,代碼可能應該失敗。

    bool  quadmath_format_needed(const char *format)
quadmath_format_valid

quadmath_snprintf() 對其 format 字符串非常嚴格,如果格式無效,則會失敗並返回 -1。它只接受一個格式指示符。

quadmath_format_valid() 檢查預期的單一規格是否合理:以 % 開始,只有一個 %,以 [efgaEFGA] 結束,並在之前有 Q。這不是完整的 "printf 語法檢查",只是基本的檢查。

如果有效則返回 true,否則返回 false。

另請參閱 "quadmath_format_needed"

    bool  quadmath_format_valid(const char *format)

SV 標誌

SVt_INVLIST

標量的類型標誌。參見 "perlapi 中的 svtype"

SV 處理

PL_Sv

一個暫存的 SV,可以根據需要進行使用。主要由宏在無法使用 "perlapi 中的 PERL_USE_GCC_BRACE_GROUPS" 的平台上作為後備使用,在這些平台上,否則將對其 SV 參數進行多次評估。

但要注意,如果在使用它的情況下,有某些東西與使用它的其他東西位於呼叫堆疊中,則這個變量將被清除,導致難以診斷的錯誤。

    PL_Sv
sv_add_arena

給定一塊內存,將其鏈接到競技場列表的頭部,並將其拆分為一系列的空閒 SV。

    void  sv_add_arena(char * const ptr, const U32 size,
                       const U32 flags)
sv_2bool

此宏僅由 sv_true() 或其宏等效物使用,僅當後者的參數既不是 SvPOKSvIOK 也不是 SvNOK 時才使用。它使用 SV_GMAGIC 標誌調用 sv_2bool_flags

    bool  sv_2bool(SV * const sv)
sv_2bool_flags

此函數僅由 sv_true() 和其相關函數使用,僅當後者的參數既不是 SvPOKSvIOK 也不是 SvNOK 時才使用。如果標誌包含 SV_GMAGIC,則首先進行 mg_get()

    bool  sv_2bool_flags(SV *sv, I32 flags)
sv_clean_all

對剩餘的每個 SV 減少引用計數,可能觸發清理操作。可能需要多次調用此函數來釋放位於復雜自相關階層中的 SV。

    I32  sv_clean_all()
sv_clean_objs

嘗試摧毀尚未釋放的所有對象。

    void  sv_clean_objs()
sv_free_arenas

釋放所有競技場使用的內存。請注意,必須已經釋放了競技場中的所有個別 SV 頭和體。

    void  sv_free_arenas()
sv_grow

擴展 SV 中的字符緩衝區。如有必要,使用 sv_unref 並將 SV 升級為 SVt_PV。返回字符緩衝區的指針。請使用 SvGROW 封裝器。

    char *  sv_grow(SV * const sv, STRLEN newlen)
sv_grow_fresh

sv_grow_freshsv_grow 的簡化版本,僅用於當 sv 是新創建的 SVt_PVSVt_PVIVSVt_PVNVSVt_PVMG 時。即 sv 具有默認標誌,從未是其他類型,且沒有現有字符串。基本上,只分配一個字符緩衝區並返回指向它的指針。

    char *  sv_grow_fresh(SV * const sv, STRLEN newlen)
sv_newref

增加 SV 的引用計數。請改用 SvREFCNT_inc() 包裝器。

    SV *  sv_newref(SV * const sv)
sv_2num

注意: sv_2num實驗性 的,可能會在沒有通知的情況下更改或刪除。

返回具有源 SV 數值的 SV,進行任何必要的引用或重載轉換。調用方預期已處理好魔法獲取。

    SV *  sv_2num(SV * const sv)
sv_pv

請改用 SvPV_nolen

    char *  sv_pv(SV *sv)
sv_pvbyte

請改用 SvPVbyte_nolen 宏。

    char *  sv_pvbyte(SV *sv)
sv_pvbyten_force

SvPVbytex_force 宏的後端。請始終使用該宏。如果 SV 無法從 UTF-8 降級,則會引發錯誤。

    char *  sv_pvbyten_force(SV * const sv, STRLEN * const lp)
sv_2pvbyte_nolen

返回 SV 的字節編碼表示的指針。可能會導致 SV 因副作用而從 UTF-8 降級。

通常通過 SvPVbyte_nolen 宏訪問。

    char *  sv_2pvbyte_nolen(SV *sv)
sv_pvn_force

以某種方式從 SV 中獲取合理的字符串。 SvPV_force 宏的私有實現,用於不能處理複雜宏表達式的編譯器。請始終使用該宏。

    char *  sv_pvn_force(SV *sv, STRLEN *lp)
sv_2pv_nolen

類似於 sv_2pv(),但不返回長度。通常應改用宏包裝器 SvPV_nolen(sv)

    char *  sv_2pv_nolen(SV *sv)
sv_pvutf8n_force

SvPVutf8x_force 宏的後端。請始終使用該宏。

    char *  sv_pvutf8n_force(SV * const sv, STRLEN * const lp)
sv_2pvutf8_nolen

返回 SV 的 UTF-8 編碼表示的指針。可能會導致 SV 因副作用而升級為 UTF-8。

通常通過 SvPVutf8_nolen 宏訪問。

    char *  sv_2pvutf8_nolen(SV *sv)
sv_pvutf8

請改用 SvPVutf8_nolen 宏。

    char *  sv_pvutf8(SV *sv)
sv_tainted

測試一個 SV 是否被污染。請使用 SvTAINTED

    bool  sv_tainted(SV * const sv)
SvTHINKFIRST

一個快速的標誌檢查,用於確定是否應將 sv 傳遞給 sv_force_normal 以在直接修改 SvIVXSvPVX 之前 "降級"。

例如,如果您的純量是一個引用,並且您想要修改 SvIVX 插槽,您不能只是執行 SvROK_off,因為這將洩漏參考。

這是內部使用的,由各種修改 sv 的函數,如 sv_setsvsv_setivsv_pvn_force

這不處理的一種情況是沒有設置 SvFAKE 的 gv。在

if (SvTHINKFIRST(gv)) sv_force_normal(gv);

之後它仍然是一個 gv。

SvTHINKFIRST 有時會產生錯誤的陽性結果。在這些情況下,sv_force_normal 不做任何事情。

    U32  SvTHINKFIRST(SV *sv)
sv_true

根據 Perl 的規則,如果 SV 具有真值,則返回 true。請改用 SvTRUE 宏,它可以調用 sv_true() 或使用內嵌版本。

    I32  sv_true(SV * const sv)
sv_untaint

取消 SV 的污染。請改用 SvTAINTED_off

    void  sv_untaint(SV * const sv)

污染

sv_taint

對 SV 進行污染。請改用 SvTAINTED_on

    void  sv_taint(SV *sv)
TAINT

如果我們不在污染檢查模式下,則不做任何操作;否則通知 "TAINT_set""TAINT_PROPER" 有一些未指定的元素被污染。

    void  TAINT()
TAINT_ENV

查看 %ENV 的多個組件是否被污染,並在任何一個被污染時調用 "taint_proper"。它搜索的組件包括像 $PATH 之類的東西。

    void  TAINT_ENV
taint_env

實現 "TAINT_ENV" 宏,通常應使用該宏。

    void  taint_env()
TAINT_get

返回某個元素是否被污染的布爾值。

    bool  TAINT_get()
TAINT_IF

如果 c 評估為 true,則調用 "TAINT" 表示某些東西被污染;否則不做任何操作。

    void  TAINT_IF(bool c)
TAINTING_get

返回污染檢查是否已啟用的布爾值。

    bool  TAINTING_get()
TAINTING_set

開啟/關閉污染檢查模式。

    void  TAINTING_set(bool s)
TAINT_NOT

刪除以前由 例如 TAINT 設置的任何污染。

    void  TAINT_NOT()
TAINT_PROPER

若無元素受污染,則不執行任何操作;否則輸出一則訊息(包含 s),指示存在污染違規。如果此類違規是致命的,則中斷。

    void  TAINT_PROPER(const char * s)
taint_proper

實現 "TAINT_PROPER" 宏,通常應改用此宏。

    void  taint_proper(const char *f, const char * const s)
TAINT_set

s 為真,則 "TAINT_get" 返回真;若 s 為假,則返回假;

    void  TAINT_set(bool s)
TAINT_WARN_get

若污染違規為致命,則返回假;若只是警告,則返回真。

    bool  TAINT_WARN_get()
TAINT_WARN_set

s 為真表示應該返回污染違規僅為警告。

s 為假表示應該返回污染違規為致命。

    void  TAINT_WARN_set(bool s)

時間

目前在時間中沒有內部 API 項目

定義名稱

目前在定義名稱中沒有內部 API 項目

Unicode 支援

bytes_from_utf8_loc

註: bytes_from_utf8_loc 是實驗性的,可能會在不通知的情況下更改或移除。

類似於 "perlapi 中的 bytes_from_utf8"(),但需要額外的參數,指向存儲不能轉換為非 UTF8 的 "s" 中第一個字符位置的指針。

如果該參數為 NULL,則此函數的行為與 bytes_from_utf8 完全相同。

否則,如果輸入時 *is_utf8p 為 0,則函數的行為與 bytes_from_utf8 完全相同,除了還將 *first_non_downgradable 設置為 NULL

否則,該函數返回一個新創建的以 NUL 結尾的字符串,其中包含 "s" 可轉換的第一部分的非 UTF8 等效。 *lenp 設置為其長度,不包括終止 NUL。如果整個輸入字符串都被轉換,則 *is_utf8p 設置為 FALSE 值,並且 *first_non_downgradable 設置為 NULL

否則,*first_non_downgradable 設置為指向原始字符串中第一個未轉換的字符的第一個字節的指針。 *is_utf8p 不變。請注意,新字符串的長度可能為 0。

另一種觀點是,如果 *first_non_downgradable 不是 NULL 而且 *is_utf8p 是 TRUE,則此函式從 "s" 的開頭開始轉換盡可能多的字符,停在找到的第一個無法轉換為非 UTF-8 的字符。 *first_non_downgradable 被設置為指向該字符。函式返回可以轉換的部分,並以新創建的以 NUL 結束的字符串形式返回,並將 *lenp 設置為其長度,不包括終止的 NUL。如果原始字符串的第一個字符無法轉換,*lenp 將為 0,並且新字符串將只包含一個 NUL。如果整個輸入字符串已轉換,則將 *is_utf8p 設置為 FALSE,並將 *first_non_downgradable 設置為 NULL

成功返回後,可以通過在調用前保存 *lenp 的值並從調用後的 *lenp 值減去它來計算轉換部分的變體數量。

    U8 *  bytes_from_utf8_loc(const U8 *s, STRLEN *lenp,
                              bool *is_utf8p,
                              const U8 **first_unconverted)
find_uninit_var

注意: find_uninit_var實驗性 的,可能會在不提前通知的情況下更改或刪除。

查找導致運算符發出“使用未初始化的值”警告的未定義變量(如果有)。如果 match 為 true,則只有在其值與 uninit_sv 匹配時才返回名稱。簡而言之,如果一元運算符(例如 OP_COS)生成警告,則跟隨運算符的直接子節點可能會得到一個給出未定義變量名稱的 OP_PADSVOP_GV。另一方面,對於 OP_ADD,有兩個分支可跟隨,因此僅在我們獲得精確匹配時才打印變量名。 desc_p 指向一個字符串指針,保存運算符的描述。如果需要,可以更新此描述。

名稱以致命 SV 形式返回。

假設 PL_op 是最初觸發錯誤的 OP,而 PL_comppad/PL_curpad 指向當前執行的 pad。

    SV *  find_uninit_var(const OP * const obase,
                          const SV * const uninit_sv, bool match,
                          const char **desc_p)
isSCRIPT_RUN

返回一個布爾值,指示從 ssend(不包括 send)的字節序列是否形成“腳本運行”。如果 utf8_target 為 TRUE,則從 s 開始的序列將被視為 UTF-8。準確地說,除了下面給出的兩個退化情況外,此函式當且僅當其中的所有代碼點來自 Unicode 的“腳本擴展”屬性給出的三個“腳本”(Common、Inherited 和可能的其他一個)的任意組合時返回 TRUE。此外,所有十進制數字必須來自相同的連續 10 位序列。

舉例來說,如果序列中的所有字元都是希臘字母、常見字元或繼承字元,且其中任何十進位數字來自相同的常見數字區塊,此函數將返回 TRUE。(這些是ASCII數字 "0".."9",以及用於數學表示法的全形形式數字區塊和其他幾個)對於(不像希臘字母那樣)有自己定義數字的腳本,此函數將接受該集合中的數字或常見數字集合之一的數字,但不接受兩者的組合。一些腳本,如阿拉伯文,具有多個數字集。所有數字必須來自同一集合,此函數才會返回 TRUE。

*ret_script,如果 ret_script 不是 NULL,在返回 TRUE 時將包含找到的腳本,使用 SCX_enum typedef。如果函數返回 FALSE,其值將為 SCX_INVALID

如果序列為空,則返回 TRUE,但是如果要求 *ret_script,則將為 SCX_INVALID

如果序列包含一個未分配給正在使用的 Unicode 版本中的字符的單個代碼點,則函數將返回 TRUE,並且腳本將為 SCX_Unknown。輸入序列中的任何其他未分配代碼點的組合將導致函數將輸入視為非腳本運行。

如果所有代碼點都來自繼承腳本,則返回的腳本將是 SCX_Inherited

否則,如果所有代碼點都來自繼承腳本或常見腳本,則返回的腳本將是 SCX_Common

    bool  isSCRIPT_RUN(const U8 *s, const U8 *send,
                       const bool utf8_target)
is_utf8_non_invariant_string

如果 perlapi 中的 "is_utf8_invariant_string" 返回 FALSE,則對於字符串 s 的前 len 個字節,但它們仍然是合法的 Perl 擴展 UTF-8,則返回 TRUE;否則返回 FALSE。

返回 TRUE 意味著由序列表示的至少一個代碼點是無法表示為單個字節的寬字符,或者表示取決於序列是否編碼為 UTF-8。

另請參見 perlapi 中的 "is_utf8_invariant_string"perlapi 中的 "is_utf8_string"

    bool  is_utf8_non_invariant_string(const U8 * const s, STRLEN len)
utf8n_to_uvuni

已棄用! 打算在以後的 Perl 版本中移除 utf8n_to_uvuni。請不要將其用於新代碼;從現有代碼中刪除它。

請改用 "utf8_to_uvchr_buf" 在 perlapi 中使用,或極少使用 "utf8n_to_uvchr" 在 perlapi 中使用

這個函式在想要處理具有 Unicode 屬性的 EBCDIC 和 ASCII 平台的程式碼中很有用,但從 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)
utf8_to_uvuni

已棄用! 打算在未來的 Perl 發行版中移除 utf8_to_uvuni。請勿在新程式碼中使用它;從現有程式碼中移除它。

返回假設為 UTF-8 編碼的字串 s 中第一個字符的 Unicode 代碼點;retlen 將設置為該字符的長度,以字節為單位。

有些 UTF-8 畸形會被檢測到,但並非所有,實際上,一些畸形的輸入可能導致讀取超出輸入緩衝區的末尾,這就是為什麼這個函式被棄用的原因之一。另一個原因是,只有在極其有限的情況下,Unicode 與本機代碼點才對您有興趣。

如果 s 指向被檢測到的某些畸形,並且已啟用 UTF8 警告,則返回零,並且如果 retlen 不是 NULL,則將 *retlen 設置為 -1。如果關閉了這些警告,則返回的計算值(如果有明確定義)(或 Unicode 替換字符,如果沒有)將被靜默返回,並且如果 retlen 不是 NULL,則設置 *retlen,以便 (s + *retlen) 是在 s 中可能開始非畸形字符的下一個位置。有關何時返回 REPLACEMENT CHARACTER 的詳細信息,請參閱 perlapi 中的 "utf8n_to_uvchr"

    UV  utf8_to_uvuni(const U8 *s, STRLEN *retlen)
uvoffuni_to_utf8_flags

此函式應僅在非常特殊的情況下使用。相反,幾乎所有程式碼應使用 perlapi 中的 "uvchr_to_utf8"perlapi 中的 "uvchr_to_utf8_flags"

這個函式就像它們一樣,但輸入是嚴格的 Unicode(而不是本機)代碼點。只有在非常罕見的情況下,代碼才不應該使用本機代碼點。

有關詳細信息,請參閱 perlapi 中的 "uvchr_to_utf8_flags" 的描述。

    U8 *  uvoffuni_to_utf8_flags(U8 *d, UV uv, UV flags)
valid_utf8_to_uvchr

像在 perlapi 中的 "utf8_to_uvchr_buf" 一樣,但應該只在已知輸入 UTF-8 字串 s 中的下一個字元是良好形式(例如,它通過 "perlapi 中的 isUTF8_CHAR")時才呼叫。允許替代字元、非字元碼點和非 Unicode 碼點。

    UV  valid_utf8_to_uvchr(const U8 *s, STRLEN *retlen)
variant_under_utf8_count

此函式檢查位於 se 之間的位元組序列,假設它們編碼為 ASCII/Latin1,並返回當字串被翻譯為 UTF-8 時,多少個位元組會發生變化。由於 UTF-8 的性質,每個位元組將佔用兩個位元組,而不是輸入字串中的單個位元組。因此,此函式返回字串在翻譯為 UTF-8 時擴展的確切位元組數。

與大多數名稱中帶有 utf8 的其他函式不同,此函式的輸入不是 UTF-8 編碼的字串。函式名稱略微奇怪,以強調這一點。

此函式是 Perl 內部的,因為 khw 認為任何想要這個函式的 XS 代碼可能與內部操作過於接近。提供有效的使用案例可能會改變這一點。

另請參閱 "perlapi 中的 is_utf8_invariant_string""perlapi 中的 is_utf8_invariant_string_loc"

    Size_t  variant_under_utf8_count(const U8 * const s,
                                     const U8 * const e)

實用函式

my_popen_list

在某些系統上實現 PerlProc_popen_list() 上的函式

    PerlIO *  my_popen_list(const char *mode, int n, SV **args)
my_socketpair

在沒有的系統上模擬 socketpair(2),但是具有足夠的功能來進行模擬。

    int  my_socketpair(int family, int type, int protocol, int fd[2])

版本控制

目前版本控制中沒有內部 API 項目

警告和終止

deprecate

封裝 Perl_ck_warner_d() 以在給定類別中產生已棄用的警告和相應的消息。 message 參數必須是 C 字串。字符串 " 已棄用" 將自動添加到 message 的末尾。

    deprecate(U32 category, "message")
deprecate_disappears_in

對Perl_ck_warner_d()進行封裝,以在給定類別中產生一個已廢棄警告,並提供一個適當的訊息,指出訊息所指涉的結構將在特定版本中消失。 whenmessage 參數必須是 C 字串。 when 字串預期應為 "5.40" 的形式,版本中不包含次要元素。 實際的訊息輸出將是以下表達式的結果 message "已廢棄,並將在 Perl 中消失" when 這就是為什麼 messagewhen 必須是字面 C 字串。

    deprecate_disappears_in(U32 category, "when", "message")
deprecate_fatal_in

對Perl_ck_warner_d()進行封裝,以在給定類別中產生一個已廢棄警告,並提供一個適當的訊息,指出訊息所指涉的結構將在特定版本中變為致命。 whenmessage 參數必須是 C 字串。 when 字串預期應為 "5.40" 的形式,版本中不包含次要元素。 實際的訊息輸出將是以下表達式的結果 message "已廢棄,並將在 Perl 中變為致命" when 這就是為什麼 messagewhen 必須是字面 C 字串。

    deprecate_fatal_in(U32 category, "when", "message")
PL_dowarn

這個 C 變數大致對應於Perl的 $^W 警告變數。 然而, $^W 被視為布林值,而 PL_dowarn 是一組標誌位。

在具有線程的 Perl 中,每個線程都有此變數的獨立副本;在創建時,每個副本都以創建線程的當前值初始化。

    U8  PL_dowarn
report_uninit

打印適當的 "使用未初始化的變數" 警告。

    void  report_uninit(const SV *uninit_sv)

XS

目前在 XS 中沒有內部 API 項目

未記錄的元素

此部分列出了其他未記錄的元素。 如果您使用其中任何一個,請考慮創建並提交相應的文檔。

實驗性和已廢棄的未記錄元素分別列在最後。

abort_execution
add_above_Latin1_folds
add_cp_to_invlist
_add_range_to_invlist
allocmy
amagic_cmp
amagic_cmp_desc
amagic_cmp_locale
amagic_cmp_locale_desc
amagic_i_ncmp
amagic_i_ncmp_desc
amagic_is_enabled
amagic_ncmp
amagic_ncmp_desc
any_dup
append_utf8_from_native_byte
apply
atfork_lock
atfork_unlock
av_arylen_p
av_extend_guts
av_iter_p
av_nonelem
av_reify
bind_match
block_gimme
boot_core_builtin
boot_core_mro
boot_core_PerlIO
boot_core_UNIVERSAL
build_infix_plugin
_byte_dump_string
call_list
cando
capture_clear
cast_iv
cast_i32
cast_ulong
cast_uv
check_hash_fields_and_hekify
check_regnode_after
check_utf8_print
ck_anoncode
ck_backtick
ck_bitop
ck_cmp
ck_concat
ck_defined
ck_delete
ck_each
ck_entersub_args_core
ck_eof
ck_eval
ck_exec
ck_exists
ck_ftst
ck_fun
ck_glob
ck_grep
ck_helemexistsor
ck_index
ck_isa
ck_join
ck_length
ck_lfun
ck_listiob
ck_match
ck_method
ck_null
ck_open
ck_prototype
ck_readline
ck_refassign
ck_repeat
ck_require
ck_return
ck_rfun
ck_rvconst
ck_sassign
ck_select
ck_shift
ck_smartmatch
ck_sort
ck_spair
ck_split
ck_stringify
ck_subr
ck_substr
ck_svconst
ck_tell
ck_trunc
ck_trycatch
ckwarn
ckwarn_d
class_add_ADJUST
class_add_field
class_apply_attributes
class_apply_field_attributes
class_prepare_initfield_parse
class_prepare_method_parse
class_seal_stash
class_set_field_defop
class_setup_stash
class_wrap_method_body
clear_defarray
closest_cop
cmpchain_extend
cmpchain_finish
cmpchain_start
cmp_desc
cmp_locale_desc
cntrl_to_mnemonic
construct_ahocorasick_from_trie
cop_file_avn
coresub_op
croak_caller
croak_kw_unless_class
croak_memory_wrap
croak_no_mem
croak_popstack
csighandler
csighandler1
csighandler3
current_re_engine
custom_op_get_field
cv_clone_into
cv_const_sv_or_av
cvgv_from_hek
cvgv_set
cvstash_set
cv_undef_flags
cx_dump
cx_dup
cxinc
deb_stack_all
debstackptrs
debug_hash_seed
debug_peep
debug_show_study_flags
debug_studydata
defelem_target
despatch_signals
die_unwind
do_aexec
do_aexec5
do_aspawn
do_eof
does_utf8_overflow
do_exec
do_exec3
dofile
do_gv_dump
do_gvgv_dump
do_hv_dump
doing_taint
do_ipcctl
do_ipcget
do_magic_dump
do_msgrcv
do_msgsnd
do_ncmp
do_op_dump
do_pmop_dump
do_print
do_readline
doref
do_seek
do_semop
do_shmio
do_spawn
do_spawn_nowait
do_sv_dump
do_sysseek
do_tell
do_trans
do_uniprop_match
do_vecget
do_vecset
do_vop
drand48_init_r
drand48_r
dtrace_probe_call
dtrace_probe_load
dtrace_probe_op
dtrace_probe_phase
dump_all_perl
dump_indent
dump_packsubs_perl
dump_sub_perl
dump_sv_child
dumpuntil
dump_vindent
dup_warnings
find_first_differing_byte_pos
find_lexical_cv
find_runcv_where
find_script
foldEQ_latin1_s2_folded
foldEQ_latin1
foldEQ_utf8_flags
force_locale_unlock
_force_out_malformed_utf8_message
form_alien_digit_msg
form_cp_too_large_msg
free_tied_hv_pool
free_tmps
get_and_check_backslash_N_name
get_ANYOFHbbm_contents
get_ANYOFM_contents
get_db_sub
get_debug_opts
get_deprecated_property_msg
getenv_len
get_extended_os_errno
get_hash_seed
get_invlist_iter_addr
get_invlist_offset_addr
get_invlist_previous_index_addr
get_mstats
get_prop_definition
get_prop_values
get_regclass_aux_data
get_re_gclass_aux_data
get_regex_charset_name
get_win32_message_utf8ness
gp_free
gp_ref
grok_bin_oct_hex
grok_bslash_c
grok_bslash_o
grok_bslash_x
gv_check
gv_fetchmeth_internal
gv_override
gv_setref
gv_stashpvn_internal
he_dup
hek_dup
hfree_next_entry
hv_auxalloc
hv_common
hv_common_key_len
hv_delayfree_ent
hv_free_ent
hv_placeholders_p
hv_pushkv
hv_rand_set
hv_undef_flags
infix_plugin_standard
init_argv_symbols
init_constants
init_dbargs
init_debugger
init_i18nl10n
init_named_cv
init_stacks
init_tm
init_uniprops
_inverse_folds
invert
invlist_array
_invlist_array_init
invlist_clear
invlist_clone
_invlist_contains_cp
invlist_contents
_invlist_dump
_invlistEQ
invlist_extend
invlist_highest
_invlist_intersection
_invlist_intersection_maybe_complement_2nd
_invlist_invert
invlist_is_iterating
invlist_iterfinish
invlist_iterinit
invlist_iternext
_invlist_len
invlist_max
invlist_previous_index
_invlist_search
invlist_set_len
invlist_set_previous_index
_invlist_subtract
invlist_trim
_invlist_union
_invlist_union_maybe_complement_2nd
invmap_dump
invoke_exception_hook
io_close
isFF_overlong
is_grapheme
_is_in_locale_category
is_invlist
is_ssc_worth_it
_is_uni_FOO
_is_uni_perl_idcont
_is_uni_perl_idstart
is_utf8_char_helper_
is_utf8_common
is_utf8_FF_helper_
_is_utf8_FOO
is_utf8_overlong
_is_utf8_perl_idcont
_is_utf8_perl_idstart
jmaybe
join_exact
keyword
keyword_plugin_standard
list
load_charnames
locale_panic
localize
lossless_NV_to_IV
lsbit_pos32
lsbit_pos64
magic_clear_all_env
magic_cleararylen_p
magic_clearenv
magic_clearhook
magic_clearhookall
magic_clearisa
magic_clearpack
magic_clearsig
magic_copycallchecker
magic_existspack
magic_freearylen_p
magic_freecollxfrm
magic_freemglob
magic_freeovrld
magic_freeutf8
magic_get
magic_getarylen
magic_getdebugvar
magic_getdefelem
magic_getnkeys
magic_getpack
magic_getpos
magic_getsig
magic_getsubstr
magic_gettaint
magic_getuvar
magic_getvec
magic_killbackrefs
magic_nextpack
magic_regdata_cnt
magic_regdatum_get
magic_regdatum_set
magic_scalarpack
magic_set
magic_set_all_env
magic_setarylen
magic_setcollxfrm
magic_setdbline
magic_setdebugvar
magic_setdefelem
magic_setenv
magic_sethook
magic_sethookall
magic_setisa
magic_setlvref
magic_setmglob
magic_setnkeys
magic_setnonelem
magic_setpack
magic_setpos
magic_setregexp
magic_setsig
magic_setsigall
magic_setsubstr
magic_settaint
magic_setutf8
magic_setuvar
magic_setvec
magic_sizepack
magic_wipepack
make_trie
malloced_size
malloc_good_size
markstack_grow
mbtowc_
mem_collxfrm_
mem_log_alloc
mem_log_del_sv
mem_log_free
mem_log_new_sv
mem_log_realloc
mg_find_mglob
mg_size
mode_from_discipline
more_bodies
more_sv
moreswitches
mortal_getenv
mortalized_pv_copy
mro_get_private_data
mro_meta_dup
mro_meta_init
msbit_pos32
msbit_pos64
multiconcat_stringify
multideref_stringify
my_atof2
my_atof3
my_attrs
my_clearenv
my_lstat
my_lstat_flags
my_memrchr
my_mkostemp_cloexec
my_mkstemp_cloexec
my_stat
my_stat_flags
my_strerror
my_strftime8_temp
my_unexec
newFORM
_new_invlist
_new_invlist_C_array
newMETHOP_internal
newMYSUB
newPROG
new_stackinfo
newSTUB
newSVavdefelem
newXS_deffile
nextargv
no_bareword_allowed
no_bareword_filehandle
noperl_die
notify_parser_that_changed_to_utf8
oopsAV
oopsHV
op_clear
op_integerize
op_lvalue_flags
opmethod_stash
op_prune_chain_head
op_relocate_sv
opslab_force_free
opslab_free
opslab_free_nopad
op_std_init
op_varname
package
package_version
pad_add_weakref
padlist_store
padname_free
PadnameIN_SCOPE
padnamelist_free
parser_dup
parser_free
parser_free_nexttoke_ops
parse_unicode_opts
path_is_searchable
peep
perl_alloc_using
perl_clone_using
PerlEnv_putenv
PerlIO_context_layers
PerlIO_restore_errno
PerlIO_save_errno
PerlLIO_dup_cloexec
PerlLIO_dup2_cloexec
PerlLIO_open_cloexec
PerlLIO_open3_cloexec
PerlProc_pipe_cloexec
PerlSock_accept_cloexec
PerlSock_socket_cloexec
PerlSock_socketpair_cloexec
perly_sighandler
pmruntime
POPMARK
populate_anyof_bitmap_from_invlist
populate_bitmap_from_invlist
populate_invlist_from_bitmap
populate_isa
pregfree
pregfree2
ptr_hash
qerror
ReANY
reentrant_free
reentrant_init
reentrant_retry
reentrant_size
re_exec_indentf
ref
reg_add_data
regcurly
regdump
regdupe_internal
regexec_flags
regfree_internal
reginitcolors
reg_named_buff
reg_named_buff_all
reg_named_buff_exists
reg_named_buff_fetch
reg_named_buff_firstkey
reg_named_buff_iter
reg_named_buff_nextkey
reg_named_buff_scalar
regnext
regnode_after
reg_numbered_buff_fetch
reg_numbered_buff_fetch_flags
reg_numbered_buff_length
reg_numbered_buff_store
regprop
reg_qr_package
reg_skipcomment
reg_temp_copy
re_indentf
re_intuit_start
re_intuit_string
re_op_compile
report_evil_fh
report_redefined_cv
report_wrongway_fh
re_printf
rpeep
rsignal_restore
rsignal_save
rvpv_dup
rxres_save
same_dirent
save_bool
save_clearsv
save_delete
save_destructor
save_destructor_x
save_freeop
save_freepv
save_freesv
save_int
save_iv
save_I8
save_I16
save_I32
save_mortalizesv
save_pptr
save_pushi32ptr
save_pushptrptr
save_re_context
save_sptr
savestack_grow
savestack_grow_cnt
save_strlen
sawparens
scalar
scalarvoid
scan_commit
scan_num
seed
set_ANYOF_arg
set_caret_X
setfd_cloexec
setfd_cloexec_for_nonsysfd
setfd_cloexec_or_inhexec_by_sysfdness
setfd_inhexec
setfd_inhexec_for_sysfd
set_numeric_standard
set_numeric_underlying
set_padlist
_setup_canned_invlist
share_hek
should_warn_nl
should_we_output_Debug_r
sighandler
sighandler1
sighandler3
single_1bit_pos32
single_1bit_pos64
Slab_Alloc
Slab_Free
Slab_to_ro
Slab_to_rw
softref2xv
sortsv_flags_impl
ssc_finalize
ssc_init
stack_grow
str_to_version
strxfrm
study_chunk
sub_crush_depth
sv_add_backref
sv_buf_to_ro
sv_del_backref
sv_i_ncmp
sv_i_ncmp_desc
sv_2iv
sv_magicext_mglob
sv_ncmp
sv_ncmp_desc
sv_only_taint_gmagic
sv_or_pv_pos_u2b
sv_pvbyten_force_wrapper
sv_pvutf8n_force_wrapper
sv_resetpvn
sv_sethek
SvTRUE_common
sv_unglob
sv_2uv
switch_locale_context
sys_init
sys_init3
sys_intern_clear
sys_intern_dup
sys_intern_init
sys_term
tied_method
tmps_grow_p
_to_fold_latin1
TOPMARK
to_uni_fold
_to_uni_fold_flags
to_uni_lower
to_uni_title
to_uni_upper
_to_upper_title_latin1
_to_utf8_fold_flags
_to_utf8_lower_flags
_to_utf8_title_flags
_to_utf8_upper_flags
translate_substr_offsets
try_amagic_bin
try_amagic_un
uiv_2buf
unlnk
unshare_hek
unwind_paren
_utf8n_to_uvchr_msgs_helper
utf16_to_utf8_base
utf16_to_utf8_reversed
utf16_to_utf8
utf8_to_uvchr_buf_helper
utilize
uvoffuni_to_utf8_flags_msgs
uvuni_to_utf8
variant_byte_number
varname
vivify_defelem
vivify_ref
wait4pid
warn_elem_scalar_context
_warn_problematic_locale
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

接下來是實驗性的未記錄元素

alloc_LOGOP           cx_pushloop_for              invlist_lowest
create_eval_scope     cx_pushloop_plain            newGP
cv_ckproto_len_flags  cx_pushsub                   new_warnings_bitfield
cx_popblock           cx_pushtry                   op_refcnt_dec
cx_popeval            cx_pushwhen                  op_refcnt_inc
cx_popformat          cx_topblock                  op_unscope
cx_popgiven           delete_eval_scope            scan_str
cx_poploop            do_open_raw                  scan_word
cx_popsub             do_open6                     scan_word6
cx_popsub_args        emulate_cop_io               skipspace_flags
cx_popsub_common      get_re_arg                   sv_free2
cx_popwhen            get_vtbl                     sv_kill_backrefs
cx_pushblock          gimme_V                      sv_setpv_freshbuf
cx_pusheval           hv_backreferences_p          sv_setsv_cow
cx_pushformat         hv_kill_backrefs             utf8_to_utf16_base
cx_pushgiven          invlist_highest_range_start  

最後是已廢棄的未記錄元素。 不要在新代碼中使用任何一個;從現有代碼中刪除所有這些出現。

get_no_modify  get_opargs  get_ppaddr  

AUTHORS

自動文檔系統最初由 Benjamin Stuhl 添加到 Perl 核心中。文檔由那些友善地記錄他們的函數的人提供。

另請參閱

config.hperlapiperlapioperlcallperlclibperlembedperlfilterperlgutsperlhacktipsperlinterpperliolperlmroapiperlreapiperlregutsperlxs