GoGPT Best VPN GoSearch

OnWorks 网站图标

perlreapi - 云端在线

在 OnWorks 免费托管服务提供商中通过 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器运行 perlreapi

这是 perlreapi 命令,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


perlreapi - Perl 正则表达式插件接口

商品描述


从 Perl 5.9.5 开始,有一个用于插入和使用正则表达式的新接口
默认引擎以外的引擎。

每个引擎都应该提供对以下格式的常量结构的访问:

typedef 结构 regexp_engine {
正则表达式* (*comp) (pTHX_
const SV * const 模式,const U32 标志);
I32 (*执行) (pTHX_
正则表达式 * const rx,
字符*字符串参数,
字符* strend,字符* strbeg,
SSize_t 减数,SV* sv,
void* 数据,U32 标志);
字符* (*直觉) (pTHX_
正则表达式 * const rx, SV *sv,
常量字符 * 常量 strbeg,
char *strpos,char *strend,U32 标志,
结构 re_scream_pos_data_s *data);
SV* (*checkstr) (pTHX_REGEXP * const rx);
void (*free) (pTHX_REGEXP * const rx);
无效 (*numbered_buff_FETCH) (pTHX_
正则表达式 * const rx,
const I32 括号,
SV * 常量 sv);
无效 (*numbered_buff_STORE) (pTHX_
正则表达式 * const rx,
const I32 括号,
SV const * 常量值);
I32 (*numbered_buff_LENGTH) (pTHX_
正则表达式 * const rx,
常量 SV * 常量 sv,
const I32 括号);
SV*(*named_buff)(pTHX_
正则表达式 * const rx,
SV * 常量键,
SV * 常量值,
U32 标志);
SV* (*named_buff_iter) (pTHX_
正则表达式 * const rx,
常量 SV * 常量最后一个键,
const U32 标志);
SV* (*qr_package)(pTHX_REGEXP * const rx);
#ifdef USE_ITHREADS
void* (*dupe) (pTHX_REGEXP * const rx, CLONE_PARAMS *param);
#ENDIF
正则表达式* (*op_comp) (...);

当一个正则表达式被编译时,它的“引擎”字段被设置为指向适当的
结构,以便在需要使用 Perl 时可以找到正确的例程来执行此操作。

为了安装新的正则表达式处理程序,$^H{regcomp} 被设置为一个整数(当
适当地铸造)解析为这些结构之一。 编译时,“comp”
方法被执行,结果“regexp”结构的引擎字段预计
指向相同的结构。

定义中的 pTHX_ 符号是 Perl 在线程下使用的一个宏,用于提供一个
包含指向正在执行的解释器的指针的例程的额外参数
正则表达式。 所以在线程处理下,所有例程都会得到一个额外的参数。

回呼


补偿
REGEXP* comp(pTHX_ const SV * const 模式,const U32 标志);

使用给定的“标志”编译存储在“模式”中的模式,并返回一个指向
准备好可以执行匹配的“REGEXP”结构。 请参阅下面的“REGEXP 结构”
用于解释 REGEXP 结构中的各个字段。

“模式”参数是用作模式的标量。 以前的版本
Perl 会传递两个“char*”,指示字符串化模式的开始和结束; 这
以下代码段可用于获取旧参数:

斯特林丰满;
char* exp = SvPV(pattern, plen);
字符* xend = exp + plen;

由于任何标量都可以作为模式传递,因此可以实现一个引擎
用数组 (""ook" =~ [ qw/ eek hlagh / ]") 或非字符串化
编译的正则表达式的形式(“”ook“=~ qr/eek/”)。 Perl 自己的引擎将永远
使用上面的代码段对所有内容进行字符串化,但这并不意味着其他引擎必须这样做。

“flags”参数是一个位域,它指示哪个“msixpn”标记了正则表达式
被编译。 它还包含其他信息,例如“使用区域设置”是否在
效果。

“eogc”标志在传递给 comp 例程之前被去除。 正则表达式
引擎不需要知道是否设置了其中任何一个,因为这些标志应该只影响
Perl 对模式及其匹配变量做了什么,而不是它如何被编译和
被执行。

到调用 comp 回调时,其中一些标志已经生效
(在适用的情况下在下面注明)。 然而,它们的大部分效果发生在合成之后
回调已在读取它填充的“rx->extflags”字段的例程中运行。

一般来说,编译后的标志应该保留在“rx->extflags”中,尽管
正则表达式引擎可能想要添加或删除其中的一些来调用或禁用一些特殊的
Perl 中的行为。 这些标志以及它们引起的任何特殊行为都被记录在案
下面:

模式修饰符:

"/m" - RXf_PMf_MULTILINE
如果这是在“rx->extflags”中,它将通过“pp_split”传递给“Perl_fbm_instr”,后者
将主题字符串视为多行字符串。

"/s" - RXf_PMf_SINGLELINE
"/i" - RXf_PMf_FOLD
"/x" - RXf_PMf_EXTENDED
如果出现在正则表达式中,“#”注释将由分词器以不同方式处理
一些案例。

TODO:记录这些案例。

"/p" - RXf_PMf_KEEPCOPY
TODO:记录这个

字符集
字符集规则由包含在该字段中的枚举确定。
这仍然是实验性的,可能会发生变化,但当前界面返回
使用内联函数“get_regex_charset(const U32 flags)”的规则。 这
当前唯一记录的值是从它返回的 REGEX_LOCALE_CHARSET,它被设置
如果“使用语言环境”有效。 如果出现在“rx->extflags”中,“split”将使用
当 RXf_SKIPWHITE 或 RXf_WHITE 在时,空格的语言环境相关定义
影响。 ASCII 空白按照 isSPACE 定义,并由内部宏定义
UTF-8 下的“is_utf8_space”和“使用区域设置”下的“isSPACE_LC”。

附加标志:

RXf_SPLIT
这个标志在 perl 5.18.0 中被删除了。 “split ' '” 现在仅在
解析器。 RXf_SPLIT 仍然是#defined,所以你可以测试它。 这是过去的方式
工作:

如果“split”被调用为“split ' '”或没有参数(这实际上意味着“split('
', $_)", 见 split),Perl 将设置这个标志。然后正则表达式引擎可以检查它
并设置 SKIPWHITE 和 WHITE extflags。 为此,Perl 引擎执行以下操作:

if (flags & RXf_SPLIT && r->prelen == 1 && r->precomp[0] == ' ')
r->extflags |= (RXf_SKIPWHITE|RXf_WHITE);

可以在编译期间设置这些标志以启用“拆分”运算符中的优化。

RXf_SKIPWHITE
这个标志在 perl 5.18.0 中被删除了。 它仍然是#defined,所以你可以设置它,但是
这样做不会有任何影响。 这是它过去的工作方式:

如果标志存在于“rx->extflags”中,“split”将从头开始删除空格
操作之前的主题字符串。 什么被认为是空白取决于
如果主题是 UTF-8 字符串并且设置了“RXf_PMf_LOCALE”标志。

如果除此标志外还设置了 RXf_WHITE,则“split”的行为类似于“split”“”
在 Perl 引擎下。

RXf_START_ONLY
告诉拆分运算符在换行符 ("\n") 上拆分目标字符串而不
调用正则表达式引擎。

如果模式是 "/^/" ("plen == 1 && *exp == '^'"),Perl 的引擎会设置这个,即使
在“/^/s”下; 见分裂。 当然,不同的正则表达式引擎可能想要使用
具有不同语法的相同优化。

RXf_白色
告诉拆分运算符在空白处拆分目标字符串而不调用
正则引擎。 空白的定义取决于目标字符串
是一个 UTF-8 字符串,如果设置了 RXf_PMf_LOCALE,则打开。

如果模式是“\s+”,Perl 的引擎会设置这个标志。

RXf_NULL
告诉拆分运算符将目标字符串拆分为字符。 的定义
字符取决于目标字符串是否为 UTF-8 字符串。

Perl 的引擎在空模式上设置这个标志,这种优化使得“拆分 //”
比其他情况要快得多。 它甚至比“解包”还要快。

RXf_NO_INPLACE_SUBST
在 perl 5.18.0 中添加,此标志表示正则表达式可能会执行
会干扰就地替换的操作。 例如它可能
包含后视,或分配给非魔法变量(例如 $REGMARK 和
$REGERROR) 在匹配期间。 "s///" 将在设置时跳过某些优化。

EXEC
I32 exec(pTHX_REGEXP * const rx,
char *stringarg,char * strend,char * strbeg,
SSize_t 减数,SV* sv,
void* 数据,U32 标志);

执行正则表达式。 论据是

rx 要执行的正则表达式。

sv 这是要匹配的 SV。 注意要匹配的实际字符数组
反对由下面描述的参数提供; SV 只是用来确定
UTF8ness、“pos()”等。

斯特贝格
指向字符串物理开始的指针。

坚持
指向字符串物理结尾后面的字符的指针(即“\0”,如果
任何)。

字符串参数
指向字符串中匹配开始位置的指针; 它可能不是
等于“strbeg”(例如在“/.../g”的后续迭代中)。

矿工
必须匹配的字符串的最小长度(以“stringarg”中的字节为单位); 如果
引擎到达匹配的结尾,但还没有到达字符串中的这个位置,它
应该失败。

data
优化数据; 可调整的。

标志
优化标志; 可调整的。

意会
字符*直觉(pTHX_
正则表达式 * const rx,
SV*sv,
常量字符 * 常量 strbeg,
字符 *strpos,
字符 * 趋势,
const U32 标志,
结构 re_scream_pos_data_s *data);

找到应该尝试正则表达式匹配的开始位置,或者如果正则表达式可能
不应运行引擎,因为模式不匹配。 这被称为,在适当的时候,
由核心,取决于“regexp”结构的“extflags”成员的值。

参数:

rx:要匹配的正则表达式
sv:被匹配的SV:只用于utf8标志; 字符串
本身是通过下面的指针访问的。 请注意,在
像重载的 SV,SvPOK(sv) 可能是假的
并且字符串指针可能指向与
SV 本身。
strbeg:字符串的真正开头
strpos:字符串中开始匹配的点
strend:指向字符串最后一个字符后面的字节的指针
当前未使用的标志; 设置为 0
数据:目前未使用; 设置为 NULL

检查字符串
SV* checkstr(pTHX_REGEXP * const rx);

返回一个包含必须出现在模式中的字符串的 SV。 由“拆分”用于
优化匹配。

免费
void free(pTHX_REGEXP * const rx);

在释放正则表达式模式时由 Perl 调用,以便引擎可以释放任何
“regexp”结构的“pprivate”成员指向的资源。 这只是
负责释放私人数据; Perl 将处理释放包含的任何其他内容
在“regexp”结构中。

编号 捕获 回调
调用以获取/设置 "$`"、"$'"、$& 及其命名等价物 ${^PREMATCH} 的值,
${^POSTMATCH} 和 ${^MATCH},以及编号的捕获组($1, $2, ...)。

“paren”参数将是 1 表示 1 美元,2 表示 2 美元等等,并具有这些符号
特殊变量的值:

${^PREMATCH} RX_BUFF_IDX_CARET_PROMATCH
${^POSTMATCH} RX_BUFF_IDX_CARET_POSTMATCH
${^MATCH} RX_BUFF_IDX_CARET_FULLMATCH
$` RX_BUFF_IDX_PREMATCH
$' RX_BUFF_IDX_POSTMATCH
$& RX_BUFF_IDX_FULLMATCH

请注意,在 Perl 5.17.3 及更早版本中,最后三个常量也用于
变量的插入符号变体。

这些名称是通过类比 Tie::Scalar 方法名称选择的,并带有一个额外的
长度 回调以提高效率。 但是命名的捕获变量目前没有绑定
在内部但通过魔法实现。

编号_buff_FETCH

void numbered_buff_FETCH(pTHX_REGEXP * const rx, const I32 paren,
SV * 常量 sv);

获取指定编号的捕获。 “sv”应设置为要返回的标量,
标量作为参数传递而不是从函数返回,因为当
它被称为 Perl 已经有一个标量来存储值,创建另一个将是
多余的。 标量可以用“sv_setsv”、“sv_setpvn”和朋友设置,见perlapi。

这个回调是 Perl 在污点模式下清除它自己的捕获变量的地方(参见
每秒)。 参见“Perl_reg_numbered_buff_fetch”函数 regcomp.c 如何去污
如果您希望引擎也这样做,请捕获变量。

编号_buff_STORE

无效 (*numbered_buff_STORE) (pTHX_
正则表达式 * const rx,
const I32 括号,
SV const * 常量值);

设置编号捕获变量的值。 “值”是要用作的标量
新值。 由引擎确保将其用作新值(或
拒绝)。

计费示例:

if ("ok" =~ /(o*)/) {
# 'paren' 将是 '1' 而 'value' 将是 'ee'
$1 =~ tr/o/e/;
}

Perl 自己的引擎会在任何修改捕获变量的尝试中发出嘶嘶声,在
另一个引擎使用以下回调(从“Perl_reg_numbered_buff_store”复制):

无效
示例_reg_numbered_buff_store(pTHX_
正则表达式 * const rx,
const I32 括号,
SV const * const 值)
{
PERL_UNUSED_ARG(接收);
PERL_UNUSED_ARG(括号);
PERL_UNUSED_ARG(值);

如果(!PL_localizing)
Perl_croak(aTHX_PL_no_modify);
}

实际上 Perl 不会 时刻 在一个看起来像是会修改一个语句的语句中发出嘶嘶声
编号的捕获变量。 这是因为如果 Perl 将不会调用 STORE 回调
可以确定它不必修改该值。 这正是捆绑的方式
变量在相同情况下的行为:

包 CaptureVar;
使用父'领带::标量';

子 TIESCALAR { 祝福 [] }
子 FETCH { undef }
sub STORE { die“这不会被调用”}

包主;

绑定我的 $sv => "CaptureVar";
$sv =~ y/a/b/;

因为 $sv 在应用 "y///" 操作符时是 "undef",所以音译
不会实际执行,程序也不会“死亡”。 这与 5.8 和
早期版本的行为是因为捕获变量是 READONLY 变量; 现在
当分配给默认引擎时,它们只会死亡。

编号_buff_LENGTH

I32 numbered_buff_LENGTH (pTHX_
正则表达式 * const rx,
常量 SV * 常量 sv,
const I32 括号);

获取捕获变量的“长度”。 对此有一个特殊的回调,以便 Perl
不必执行 FETCH 并在结果上运行“长度”,因为长度是(在 Perl 中
case) 从存储在“rx->offs”中的偏移量中得知,这样效率更高:

I32 s1 = rx->offs[paren].start;
I32 s2 = rx->offs[paren].end;
I32 长度 = t1 - s1;

这在 UTF-8 的情况下有点复杂,看看什么
"Perl_reg_numbered_buff_length" 与 is_utf8_string_loclen 一起使用。

命名 捕获 回调
调用以获取/设置 "%+" 和 "%-" 的值,以及由 re 中的一些实用函数调用。

有两个回调,“named_buff”在所有情况下都被调用,FETCH、STORE、DELETE、
CLEAR、EXISTS 和 SCALAR Tie::Hash 回调将更改为“%+”和“%-”以及
"named_buff_iter" 与 FIRSTKEY 和 NEXTKEY 的情况相同。

“flags”参数可用于确定回调中的哪些操作
应该回应。 当前定义了以下标志:

哪个 Tie::Hash 操作是从 Perl 级别对 "%+" 或 "%+" 执行的,如果有的话:

RXapif_FETCH
RXapif_STORE
RXapif_DELETE
RXapif_CLEAR
RXapif_EXISTS
RXapif_SCALAR
RXapif_FIRSTKEY
RXapif_NEXTKEY

如果正在操作“%+”或“%-”(如果有)。

RXapif_ONE /* %+ */
RXapif_ALL /* %- */

如果这被称为“re::regname”、“re::regnames”或“re::regnames_count”,如果有的话。
前两个将与“RXapif_ONE”或“RXapif_ALL”组合。

RXapif_REGNAME
RXapif_REGNAMES
RXapif_REGNAMES_COUNT

内部“%+”和“%-”是通过一个真正的绑定接口实现的
Tie::Hash::NamedCapture。 该包中的方法将回调到这些函数中。
但是,用于此目的的 Tie::Hash::NamedCapture 的使用将来可能会发生变化
发布。 例如,这可能是通过魔术来实现的(需要一个
扩展到 mgvtbl)。

命名buff

SV* (*named_buff) (pTHX_REGEXP * const rx, SV * const key,
SV * const 值,U32 标志);

命名_buff_iter

SV* (*named_buff_iter) (pTHX_
正则表达式 * const rx,
常量 SV * 常量最后一个键,
const U32 标志);

qr_包
SV* qr_package(pTHX_REGEXP * const rx);

qr// 魔法对象被祝福到的包(如“ref qr//”所示)。 它是
建议引擎将其更改为它们的包名称以进行识别
如果他们在对象上实现方法。

此方法返回的包中也应该有内部的“Regexp”包
@ISA。 "qr//->isa("Regexp")" 应该始终为真,无论引擎是什么
用过的。

示例实现可能是:

SV*
Example_qr_package(pTHX_REGEXP * const rx)
{
PERL_UNUSED_ARG(接收);
return newSVpvs("re::engine::Example");
}

对使用“qr//”创建的对象的任何方法调用都将作为
正常对象。

使用 re::engine:: 示例;
我的 $re = qr//;
$re->meth; # 发送到 re::engine::Example::meth()

要从 XS 函数的标量中检索“REGEXP”对象,请使用“SvRX”宏,
请参阅 perlapi 中的“REGEXP 函数”。

无效方法(SV * rv)
代码:
正则表达式 * re = SvRX(sv);

欺骗
void* dupe(pTHX_REGEXP * const rx, CLONE_PARAMS *param);

在线程构建中,可能需要复制正则表达式,以便模式可以被使用
多线程。 此例程预计将处理任何私人数据的重复
由“regexp”结构的“pprivate”成员指向。 它将被调用
预先构造的新“regexp”结构作为参数,“pprivate”成员将指向
这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 私有结构,并且这个例程有责任构建一个副本和
返回一个指向它的指针(然后 Perl 将使用它来覆盖传递给 this 的字段)
常规。)

这允许引擎复制其私人数据,但也可以在必要时修改最终的
结构,如果它真的必须。

在非线程构建中,此字段不存在。

op_comp
这是 Perl 核心私有的,可能会发生变化。 应该留空。

这个 REGEXP 结构体


REGEXP 结构定义在 正则表达式. 所有正则表达式引擎必须能够正确
在他们的“comp”例程中构建这样的结构。

REGEXP 结构包含 Perl 需要知道才能正常工作的所有数据
用正则表达式。 它包括有关 Perl 可以用来进行的优化的数据
确定是否真的应该使用正则表达式引擎,以及其他各种控制信息
需要在各种上下文中正确执行模式,例如如果模式
以某种方式锚定,或者在编译期间使用了哪些标志,或者程序是否
包含 Perl 需要注意的特殊结构。

此外,它还包含两个专供正则表达式私人使用的字段
编译模式的引擎。 这些是“intflags”和“pprivate”成员。
“pprivate”是一个指向任意结构的空指针,它的使用和管理是
编译引擎的责任。 Perl 永远不会修改这些值中的任何一个。

typedef 结构正则表达式 {
/* 什么引擎创建了这个正则表达式? */
const struct regexp_engine* 引擎;

/* 这是什么轻量级副本? */
结构正则表达式* Mother_re;

/* 有关 Perl 核心用于管理的匹配的信息
* 事物 */
U32 extflags; /* 外部和内部使用的标志 */
I32 minlen; /* 最小可能的字符数 */
要匹配的字符串 */
I32 minlenret; /* $& 中最小可能的字符数 */
U32 高尔夫球; /* 我们从中搜索的 pos 左边的字符 */

/* 关于必须出现的字符串的子字符串数据
在最后一场比赛中,用于优化 */
结构 reg_substr_data *substrs;

U32 nparens; /* 捕获组数 */

/* 私有引擎特定数据 */
U32 intflags; /* 引擎特定的内部标志 */
无效 *私人; /* 正则表达式引擎私有的数据
创建了这个对象。 */

/* 关于最后/当前匹配的数据。 这些在修改期间
*匹配*/
U32 lastparen; /* 匹配的最高关闭括号 ($+) */
U32 lastcloseparen; /* 最后一个关闭括号匹配 ($^N) */
regexp_paren_pair *swap; /* 交换 *offs 的副本 */
regexp_paren_pair *offs; /* (@-) 和的偏移量数组
(@+)*/

字符 *subbeg; /* 保存或原始字符串,所以 \digit 工作
永远。 */
SV_SAVED_COPY /* 如果非 NULL,SV 是来自原始的 COW */
I32子镜头; /* subbeg 指向的字符串长度 */
I32 子偏移量; /* subbeg 从逻辑开始的字节偏移量
字符串 */
I32 子偏移量; /* suboffset equiv,但在字符中(对于@-/@+)*/

/* 不经常使用的匹配信息 */
I32 prelen; /* 预压缩长度 */
const char *precomp; /* 预编译正则表达式 */

字符 * 包裹; /* 模式的包装版本 */
I32 包裹; /* 包裹长度 */

I32 seen_evals; /* 模式中 eval 组的数量 - 对于
安全检查*/
HV *paren_names; /* 可选的父名称哈希 */

/* 这个正则表达式的引用计数 */
I32 refcnt; /* 这个正则表达式的引用计数 */
正则表达式;

下面将更详细地讨论这些字段:

“引擎”
该字段指向“regexp_engine”结构,该结构包含指向
用于执行匹配的子程序。 它是编译例程的
在返回正则表达式对象之前填充此字段的责任。

除非在 $^H{regcomp} 中指定了自定义引擎,否则在内部将其设置为“NULL”,
Perl 自己的回调集可以在“RE_ENGINE_PTR”指向的结构中访问。

“mother_re”
待办事项,见http://www.mail-archive.com/perl5-changes@perl.org/msg17328.html>

“extflags”
这将被 Perl 用来查看编译正则表达式的标志,这将
通常由 comp 回调设置为 flags 参数的值。 看比赛
有效标志的文档。

“敏伦” “minlenret”
模式匹配所需的最小字符串长度(以字符为单位)。 这是用
通过不费心去匹配更接近字符串末尾的位置来修剪搜索空间
将允许匹配。 例如,即使启动正则表达式引擎也没有意义,如果
minlen 是 10 但字符串只有 5 个字符长。 没有办法
模式可以匹配。

“minlenret”是在 $& 中找到的字符串的最小长度(以字符为单位)
一场比赛后。

“minlen”和“minlenret”之间的区别可以在以下模式中看出:

/ns(?=\d)/

其中“minlen”将为 3,但“minlenret”仅为 2,因为 \d 需要
匹配但实际上并未包含在匹配的内容中。 这种区别是
特别重要,因为替换逻辑使用“minlenret”来判断它是否可以
就地替换(这些可以导致相当大的加速)。

“戈夫”
左偏移距 pos() 开始比赛。

“substr”
关于必须出现在最终匹配中的字符串的子字符串数据。 这是目前仅
由 Perl 引擎内部使用,但将来可能用于所有引擎
优化。

"nparens", "lastparen", "lastcloseparen"
这些字段用于跟踪在
模式,这是最后一个要输入的开盘价,哪个是最后一个收盘价
被输入。

“内部标志”
模式编译时使用的标志的引擎私有副本。 通常这是
与“extflags”相同,除非引擎选择修改其中之一。

“私人”
指向引擎定义的数据结构的 void*。 Perl 引擎使用
“regexp_internal”结构(参见 perlreguts 中的“Base Structures”)但自定义引擎
应该使用别的东西。

“交换”
没用过。 留在这里是为了与 Perl 5.10.0 兼容。

“关闭”
一个“regexp_paren_pair”结构,它定义了被匹配字符串的偏移量
对应于 $& 和 $1, $2 等捕获,定义了“regexp_paren_pair”结构
如下:

typedef struct regexp_paren_pair {
I32 开始;
I32结束;
} 正则表达式_paren_pair;

如果“->offs[num].start”或“->offs[num].end”为“-1”,则该捕获组不匹配。
“->offs[0].start/end”代表$&(或“//p”下的“${^MATCH}”)和“->offs[paren].end”
匹配 $$paren 其中 $paren = 1>。

“预压缩” “prelen”
用于优化。 “precomp”保存了已编译模式的副本,并且
“prelen”它的长度。 当要编译新模式时(例如在循环内)
内部“regcomp”运算符检查最后编译的“REGEXP”的“precomp”和“prelen”
等价于新的,如果是,则使用旧模式而不是编译新模式
一。

来自“Perl_pp_regcomp”的相关片段:

if (!re || !re->precomp || re->prelen != (I32)len ||
memNE(re->precomp, t, len))
/* 编译一个新模式 */

“父母姓名”
这是内部用于跟踪命名捕获组及其偏移量的哈希。 按键
是缓冲区的名称,值是双变量,IV 插槽保存数字
具有给定名称的缓冲区和 pv 是 I32 的嵌入式数组。 这些值可能
在命名的反向引用是
用过的。

“substr”
保存最长字符串的信息,该字符串必须出现在距开头的固定偏移处
的模式,以及必须出现在从开始的浮动偏移量的最长字符串
的图案。 用于对字符串进行 Fast-Boyer-Moore 搜索,以确定它是否
值得使用正则表达式引擎,如果是的话,在字符串中搜索的位置。

“次要” “亚伦” “保存的副本” “子偏移” “子偏移量”
在执行阶段用于管理搜索和替换模式,以及
为 $&、$1 等提供文本。“subbeg”指向一个缓冲区(要么是原始的
字符串,或在“RX_MATCH_COPIED(rx)”的情况下的副本,“sublen”是长度
缓冲。 “RX_OFFS”开始和结束索引索引到这个缓冲区中。

在存在“REXEC_COPY_STR”标志的情况下,但添加了
“REXEC_COPY_SKIP_PRE”或“REXEC_COPY_SKIP_POST”标志,引擎可以选择不复制
完整的缓冲区(尽管它仍然必须在存在“RXf_PMf_KEEPCOPY”或
在“PL_sawampersand”中设置相关位)。 在这种情况下,它可以将“suboffset”设置为
表示从缓冲区的逻辑开始到物理开始的字节数
(即“subbeg”)。 它还应该设置“subcoffset”,即偏移量中的字符数。
后者需要支持以字符而非字节工作的“@-”和“@+”。

“包裹” “包裹”
存储字符串“qr//”字符串化为。 例如,Perl 引擎将“(?^:eek)”存储在
“qr/eek/”的情况。

当使用不支持内联修饰符的“(?:)”构造的自定义引擎时,
最好将“qr//”字符串化为提供的模式,请注意,这将
在以下情况下创建不需要的模式:

我的 $x = qr/a|b/; # "a|b"
我的 $y = qr/c/i; # “C”
我的 $z = qr/$x$y/; # "a|bc"

除了让自定义引擎理解
像“(?:)”这样的结构。

“seen_evals”
这存储了模式中 eval 组的数量。 这用于安全目的
当使用“qr//”将编译后的正则表达式嵌入到更大的模式中时。

“参考”
结构被引用的次数。 当它降到 0 时,正则表达式是
通过调用 pregfree 自动释放。 这应该在每个引擎的设置中设置为 1
“补偿”例程。

历史


最初是 perlreguts 的一部分。

作者


最初由 Yves Orton 编写,由 AEvar Arnfjoer` Bjarmason 扩展。

使用 onworks.net 服务在线使用 perlreapi


免费服务器和工作站

下载 Windows 和 Linux 应用程序

Linux 命令

Ad




×
广告
❤️在这里购物、预订或购买——免费,有助于保持服务免费。